假设我的数据库方案如下:
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为该产品生产线。
啊,找到我的答案:
使用 GROUP_CONCAT* 时,您永远不会忘记 GROUP BY 子句。我在第二个查询中失踪了。 *GROUP BYT_PRODUCT.id_product
GROUP BYT_PRODUCT.id_product
如果有人像我一样心不在a,我将不提问题。
编辑 :
从这个答案中,我认为我还可以激活SQL模式ONLY_FULL_GROUP_BY,以在丢失或不正确的GROUPBY的情况下强制MySQL引发错误。
ONLY_FULL_GROUP_BY