我有这样的查询:
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中进行此查询?
也许我在没有任何实际好处的情况下使一切变得复杂。 我试图只执行一个查询,因为性能,但现在我不太确定它是否更快执行两个查询(一个用于选择构面,另一个用于图像)。
请解释一下您认为最佳解决方案是什么以及为什么。
谢谢!
答案 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.