包含多行/结果的内部联接表获取第一个错误:#1055

f1tvaqid  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(154)

我有以下疑问:

SELECT p.product_id , p.product_slug , p.product_name , c.category_slug 
FROM products p 
INNER JOIN product_category_relations pcr ON pcr.relations_product_id = p.product_id 
INNER JOIN categories c ON c.category_id = pcr.relations_category_id 
GROUP BY p.product_id 
ORDER BY p.product_id

错误:

1055-select list的表达式#4不在group by子句中,并且包含未聚合列“c.category_slug”,该列在功能上不依赖于group by子句中的列;这与sql\u mode=only\u full\u group by不兼容

一个产品可以有多个关系/类别 INNER JOIN categories c ON c.category_id = pcr.relations_category_id ,我只想抢第一个。
如何通过一个查询实现这一点?
例子:

jdzmm42g

jdzmm42g1#

您可能需要在非产品列上使用聚合函数 group_concat() :

SELECT p.product_id, p.product_slug, p.product_name,
       group_concat(c.category_slug) as category_slugs
FROM products p JOIN
     product_category_relations pcr
     ON pcr.relations_product_id = p.product_id JOIN
     categories c
     ON c.category_id = pcr.relations_category_id 
GROUP BY p.product_id 
ORDER BY p.product_id ;

一般来说 SELECT 列必须与 GROUP BY 钥匙。事实上,这种不匹配导致了你的错误。
在这个查询中,特别允许不匹配,因为 product_id 是的主键 products . 按主键(或任何唯一键)聚合时,可以选择其他列。不过,你可以明确地说:

SELECT p.product_id, p.product_slug, p.product_name,
       group_concat(c.category_slug) as category_slugs
FROM products p JOIN
     product_category_relations pcr
     ON pcr.relations_product_id = p.product_id JOIN
     categories c
     ON c.category_id = pcr.relations_category_id 
GROUP BY p.product_id, p.product_slug, p.product_name 
ORDER BY p.product_id ;

相关问题