小编典典

GROUP_CONCAT和LEFT_JOIN问题-并非所有行都返回

sql

假设我的数据库方案如下:

T_PRODUCT
id_product (int, primary)

two entries: (id_product =1) , (id_product =2)

T_USER
id_user (int, primary)
id_product (int, foreign key)
name_user (varchar)

two entries: (id_product=1,name_user='John') , (id_product=1,name_user='Mike')

如果我运行第一个查询来获取所有产品及其用户(如果有的话),则会得到以下信息:

SELECT T_PRODUCT.id_product, T_USER.name_user 
FROM T_PRODUCT
LEFT JOIN T_USER on T_USER.id_product = T_PRODUCT.id_product;

>>
id_product name_user
1          John
1          Mike
2          NULL

对我来说看上去很好。现在,如果我想做同样的事情,除了我希望每行有一个产品,并使用级联的用户名(如果有任何用户,否则为NULL):

SELECT T_PRODUCT.id_product, GROUP_CONCAT(T_USER.name_user) 
FROM T_PRODUCT
LEFT JOIN T_USER on T_USER.id_product = T_PRODUCT.id_product;

>>
id_product name_user
1          John,Mike

**expected output**:
id_product name_user
1          John,Mike
2          NULL

如果没有产品的用户,即使存在 LEFT JOIN ,GROUP_CONCAT也会阻止mysql为该产品生产线。

  1. 这是预期的MySQL行为吗?
  2. 有什么办法可以使用GROUP_CONCAT或其他函数来获得预期的输出吗?

阅读 387

收藏
2021-04-28

共1个答案

小编典典

啊,找到我的答案:

使用 GROUP_CONCAT* 时,您永远不会忘记 GROUP BY 子句。我在第二个查询中失踪了。 *GROUP BYT_PRODUCT.id_product

如果有人像我一样心不在a,我将不提问题。

编辑

从这个答案中,我认为我还可以激活SQL模式ONLY_FULL_GROUP_BY,以在丢失或不正确的GROUPBY的情况下强制MySQL引发错误。

2021-04-28