MYSQL多次分组加入

时间:2014-02-10 11:38:46

标签: php sql

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_details

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    | title    |  format
 0             one        home 
 1             two        home    
 2            three       work   

1 个答案:

答案 0 :(得分:0)

在您的桌面结构发布后,我相信,我可以看到您的意图。看起来您试图将输出结果集限制为product.product的值,这些值从不重复。也就是说,product.product的值只有一个product.title

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

在这种情况下,由于您每个product.product只需要返回一行,您可以在顶层进行聚合,而不需要子查询。如果您已加入其他表,并且由于其他一对多关系而最终每个product获得多行,则需要使用子查询方法(无论如何都是可移植的 - MySQL仍可能允许这个)

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

以下是演示:http://sqlfiddle.com/#!2/72eda/6

如果您确实希望每个p.product返回多行,例如,如果您加入了其他一对多相关表,则处理该行的有效方法是对子查询执行JOINHAVING条款中强加了这个限制。不符合HAVING条件的那些不会在子查询中返回,因此被INNER JOIN丢弃。

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'

http://sqlfiddle.com/#!2/72eda/2