web-dev-qa-db-ja.com

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を使用して取得できますが、別の問題があります。同じタイトルの画像が2つある場合、そのうちの1つが省略され、次のようになります。
images_id = "7,3,5"
images_title = "Title7and3、Title5"

そのため、images_idとimages_titleの関係が恋しいです。

MySQLでこのクエリを実行できるかどうか誰かが知っていますか?

たぶん私は本当の利益なしにすべてを複雑にしているのでしょう。パフォーマンスのために1つのクエリのみを実行しようとしていますが、2つのクエリ(たとえば、ファセットの選択用と画像用)を実行する方がさらに高速かどうかはわかりません。

これに対する最善の解決策は何だと思いますか、またその理由を説明してください。

ありがとう!

21
Enrique

DISTINCTを追加するだけです。

例:
GROUP_CONCAT(DISTINCT image.id) AS images_id

43
romrom

各グループを個別に取得する必要があります。

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
...
10
Bohemian

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
4
Sahir Ali

問題が速度である場合は、必要なすべてのデータを個別の行として選択し、アプリケーションでグループ化を行う方がはるかに高速な場合があります。

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.
1
Will Sheppard