私はこのようなクエリを持っています:
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つのクエリ(たとえば、ファセットの選択用と画像用)を実行する方がさらに高速かどうかはわかりません。
これに対する最善の解決策は何だと思いますか、またその理由を説明してください。
ありがとう!
DISTINCT
を追加するだけです。
例:GROUP_CONCAT(DISTINCT image.id) AS images_id
各グループを個別に取得する必要があります。
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
...
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
問題が速度である場合は、必要なすべてのデータを個別の行として選択し、アプリケーションでグループ化を行う方がはるかに高速な場合があります。
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.