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
答案 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
返回多行,例如,如果您加入了其他一对多相关表,则处理该行的有效方法是对子查询执行JOIN
在HAVING
条款中强加了这个限制。不符合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'