使用MySQL在不同字段上多个GROUP_CONCAT

时间:2011-09-21 21:15:02

标签: mysql group-concat

我有这样的查询:

SELECT product.id,
       GROUP_CONCAT(image.id) AS images_id,
       GROUP_CONCAT(image.title) AS images_title,
       GROUP_CONCAT(facet.id) AS facets_id
...
GROUP BY product.id

查询有效,但不符合预期,因为如果我有一个包含5个构面和1个图像的产品(假设图像的id = 7),那么我会在“images_id”中得到类似的内容:
“7,7,7,7,7”
如果我有2张图片(7和3),那么我得到的结果如下:
“7,7,7,7,7,3,3,3,3,3”
在各个方面我得到的结论如下:
“8,7,6,5,4,8,7,6,5,4”

我认为MySQL正在对查询返回的不同行进行某种类型的联合,然后连接所有内容。

我的预期结果是(对于最后一个例子):

images_id =“7,3”
facets_id =“8,7,6,5,4”

我可以在GROUP_CONCAT中使用DISTINCT获得它,但是我有另一个问题: 如果我有两个具有相同标题的图像,其中一个是无效的,然后我会得到类似的结果:
images_id =“7,3,5”
images_title =“Title7and3,Title5”

所以我想念images_id和images_title之间的关系。

有人知道是否可以在MySQL中进行此查询?

也许我在没有任何实际好处的情况下使一切变得复杂。 我试图只执行一个查询,因为性能,但现在我不太确定它是否更快执行两个查询(一个用于选择构面,另一个用于图像)。

请解释一下您认为最佳解决方案是什么以及为什么。

谢谢!

4 个答案:

答案 0 :(得分:40)

只需添加DISTINCT

例:
GROUP_CONCAT(DISTINCT image.id) AS images_id

答案 1 :(得分:9)

您需要分别获得每个小组:

SELECT
    p.id,
    images_id,
    images_title,
    facets_id,
    ...
FROM PRODUCT p
JOIN (SELECT product.id, GROUP_CONCAT(image.id) AS images_id
      FROM PRODUCT GROUP BY product.id) a on a.id = p.id
JOIN (SELECT product.id, GROUP_CONCAT(image.title) AS images_title
      FROM PRODUCT GROUP BY product.id) b on b.id = p.id
JOIN (SELECT product.id, GROUP_CONCAT(facet.id) AS facets_id
      FROM PRODUCT GROUP BY product.id) b on c.id = p.id
...

答案 2 :(得分:4)

您只需添加DISTINCT关键字,即可得到您想要的结果。

SELECT tb_mod.*, tb_van.*,
GROUP_CONCAT(DISTINCT tb_voil.vt_id) AS voil,
GROUP_CONCAT(DISTINCT tb_other.oa_id) AS other, 
GROUP_CONCAT(DISTINCT tb_ref.rp_id) AS referral
FROM cp_modules_record_tbl tb_mod 
LEFT JOIN cp_vane_police_tbl tb_van ON tb_van.mr_id= tb_mod.id
LEFT JOIN cp_mod_voilt_tbl tb_voil ON tb_voil.mr_id= tb_mod.id
LEFT JOIN cp_mod_otheraction_tbl tb_other ON tb_other.mr_id= tb_mod.id
LEFT JOIN cp_mod_referral_tbl tb_ref ON tb_ref.mr_id= tb_mod.id
WHERE tb_mod.mod_type = 2 GROUP BY tb_mod.id

答案 3 :(得分:1)

如果问题是速度问题,那么简单地选择所需的所有数据作为单独的行可能要快得多,并在应用程序中进行分组,即:

SELECT product.id, image.id, image.title, facet.id

然后在申请中:

foreach row:
    push product_id onto list_of_product_ids
    push image_id onto list_of_image_ids
etc.