需要一些GROUP_CONCAT MySQL请更好地理解

时间:2013-01-23 20:49:42

标签: php mysql group-concat

我遇到的问题是有多个list_items.item_id(其中有两个)。似乎组concat只是将所有信息集中在一起,而不是将它们与父表的每一行混为一谈。这是我第一次使用GROUP_CONCAT的牛仔竞技表演。我希望解决的是每个父项都连接了连接信息。 任何帮助表示赞赏。

SELECT list_items.item_id, sub_cats.cat_name as subcatname, 
main_cats.cat_name maincatname, main_title,fabric,other,care,item_main_cat,item_sub_cat,
GROUP_CONCAT(sub_id) as subidgrp,
GROUP_CONCAT(price) as pricegrp,
GROUP_CONCAT(item_size) as itemszgrp,
GROUP_CONCAT(item_color) as itmcolorgrp,
GROUP_CONCAT(img_name) as imgnmgrp,
GROUP_CONCAT(item_quantity) as itmqntygrp
from list_items LEFT JOIN item_size_etc ON      
list_items.item_id = item_size_etc.parent_id LEFT JOIN main_cats on     
list_items.item_main_cat=main_cats.cat_id LEFT JOIN sub_cats on 
list_items.item_sub_cat=sub_cats.cat_id where list_items.active='Y'  

2 个答案:

答案 0 :(得分:3)

任何聚合函数(COUNT,SUM,MAX等)的默认行为是将整个表视为一个“组”。

要使每个组对应于给定列的不同值,换句话说,为每个项目获取小计,您需要添加GROUP BY子句。

例如,将其添加到查询的末尾:

...
GROUP BY list_items.item_id

答案 1 :(得分:3)

GROUP_CONCAT() is an aggregate function,这意味着它希望GROUP BY子句的存在能够正常运行。因为MySQL(与其他RDBMS不同)对GROUP BY内容很宽松,所以您的查询在语法上是有效的,但不会产生正确的结果。

如果您只是添加GROUP BY list_items.item_id可能会获得所需的结果,但最好是列出SELECTGROUP BY列表中的所有列。

SELECT
  list_items.item_id, 
  sub_cats.cat_name as subcatname, 
  main_cats.cat_name maincatname,
  main_title,
  fabric,
  other, 
  care,
  item_main_cat,
  item_sub_cat,
  GROUP_CONCAT(sub_id) as subidgrp,
  GROUP_CONCAT(price) as pricegrp,
  GROUP_CONCAT(item_size) as itemszgrp,
  GROUP_CONCAT(item_color) as itmcolorgrp,
  GROUP_CONCAT(img_name) as imgnmgrp,
  GROUP_CONCAT(item_quantity) as itmqntygrp
FROM 
  list_items
  LEFT JOIN item_size_etc ON  list_items.item_id = item_size_etc.parent_id
  LEFT JOIN main_cats on  list_items.item_main_cat=main_cats.cat_id
  LEFT JOIN sub_cats on list_items.item_sub_cat=sub_cats.cat_id 
WHERE list_items.active='Y'  
GROUP BY
list_items.item_id, 
  sub_cats.cat_name as subcatname, 
  main_cats.cat_name maincatname,
  main_title,
  fabric,
  other, 
  care,
  item_main_cat,
  item_sub_cat