Php MYSQL多组连接
我想先从product表中按“product”分组,但也要在info表中按格式分组 这是为了不显示格式和产品的副本。目前,只有按产品分组才有效 表-产品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 |
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'