Php MYSQL多组连接

Php MYSQL多组连接,php,sql,Php,Sql,我想先从product表中按“product”分组,但也要在info表中按格式分组 这是为了不显示格式和产品的副本。目前,只有按产品分组才有效 表-产品 SELECT p.product, q.format, p.title FROM product p JOIN info q ON p.product = q.product WHERE p.user='$user' GROUP BY p.product,q.format 表-产品详细信息 product |

我想先从product表中按“product”分组,但也要在info表中按格式分组

这是为了不显示格式和产品的副本。目前,只有按产品分组才有效

表-产品

SELECT 
  p.product,
  q.format,
  p.title
FROM 
  product p
  JOIN info q  ON p.product = q.product
WHERE p.user='$user'
GROUP BY p.product,q.format
表-产品详细信息

product    | title    
0            one            
1            two        
1            two - a    
2            three     
所以对于这个例子,我想要一个如下的列表:

product    | title    | format |
0            one         home      
1            two         home     
1            two - a     home      
2            three       work     
而不是:

 product    | title    |  format
 0             one        home
 2            three       work    

在你的表格结构发布后,我可以看出你的意图,我相信。看起来您正试图将输出结果集限制为永不重复的
product.product
的值。也就是说,
product.product
的值正好有一个
product.title

为此,您可以使用
groupby
聚合,在应用组后仅返回
COUNT(*)=1
的值

在这种情况下,由于每个
product.product
只需要返回一行,因此可以在顶层进行聚合,而不需要子查询。如果您加入了其他表,并且由于其他一对多关系而导致每个
产品
返回了多行,那么您需要改用子查询方法(无论如何,为了便于移植,MySQL可能仍然允许这样做)

下面是一个演示:

如果您确实希望每个
p.product
返回多行,例如如果您加入了额外的一对多相关表,那么一种有效的处理方法是对在
HAVING
子句中施加该限制的子查询执行
JOIN
。那些不满足
HAVING
条件的将不会在子查询中返回,因此将被
内部连接丢弃

SELECT 
  p.product,
  q.format,
  p.title
FROM 
  products p
  JOIN product_details q ON p.product = q.product
GROUP BY
  p.product,
  q.format,
  p.title
HAVING COUNT(*) = 1

分组依据
在这里不合适,因为您没有聚合函数(
COUNT()、SUM()、MAX()、
等),您想在这两列上排序吗?请发布你的数据样本和你期望结果的样本。注意这不是重复的。如果这都是你的代码,我们会假设除非你发布更多的代码,否则你可以在
选择
后添加
DISTINCT
。我已经编辑并添加了p.title,还有其他字段需要检索,DISTINCT不应该包含在这些字段中,我不知道如何使用DISTINCT并将其仅应用于特定字段
DISTINCT
应用于整行,而不是任何特定列。如果它没有给你预期的结果,你需要按照前面的建议发布预期的结果。
SELECT 
  p.product,
  q.format,
  p.title
FROM 
  products p
  JOIN product_details q ON p.product = q.product
GROUP BY
  p.product,
  q.format,
  p.title
HAVING COUNT(*) = 1
SELECT 
  p.product,
  q.format,
  p.title
FROM 
  products p
  INNER JOIN product_details q ON p.product = q.product
  /* Subquery returns only product values having exactly 1 row */
  INNER JOIN (
    SELECT product
    FROM products
    GROUP BY product
    HAVING COUNT(*) = 1
  ) pcount ON p.product = pcount.product
WHERE p.user = '$user'