JOIN
とGROUP_CONCAT
で問題があります。クエリは、結合に関連付けられていない追加のデータを連結しています。ここでMySQL - group_concatが不正なデータを追加しています
は、私のテーブル構造です:
linkages
ID table_name tag_id
1 subcategories 6
2 categories 9
music
ID artwork
1 5
2 4
artwork
ID url_path
1 /some/file/path
2 /some/file/path
そしてここでは、私のクエリです:
SELECT music.*,
artwork.url_path AS artwork_url_path,
GROUP_CONCAT(linkages.tag_id) AS tag_ids,
GROUP_CONCAT(linkages.table_name) AS table_name
FROM music
LEFT JOIN artwork ON artwork.id = music.artwork
LEFT JOIN linkages ON music.id = linkages.track_id
WHERE music.id IN('1356',
'1357',
'719',
'169',
'170',
'171',
'805')
ORDER BY FIELD(music.id,
1356,
1357,
719,
169,
170,
171,
805)
これはGROUP_CONCAT
の結果である:
[tag_ids] => 3, 6, 9, 17, 19, 20, 26, 49, 63, 64, 53, 57, 63, 65, 67, 73, 79, 80, 85, 96, 98, 11, 53, 67, 3, 6, 15, 17, 26, 38, 50, 63, 74, 53, 56, 57, 62, 63, 65, 66, 67, 72, 85, 88, 98, 24, 69, 71, 3, 6, 15, 17, 26, 38, 50
結果の最初の部分があります正しい:
[tag_ids] => 3, 6, 9, 17, 19, 20, 26, 49, 63, 64, 53, 57, 63, 65, 67, 73, 79, 80, 85, 96, 98, 11, 53, 67
正しい値の後にあるものはすべてランダムに見えますが、値の大部分はデータベースの結果には存在しませんが、まだ引き込まれています。正しい結果(3, 6, 15, 17
- 3, 6, 17
正確ではありますが、他の数字の集合 - 71
などと同じように、15
は存在しません。結果から多次元配列としてtag_id
とtable_name
の結果を一致させる必要があるため、DISTINCT
を使用できません。
なぜですか?
更新: 私はゴードンからの最初のプッシュでそれを解決しました。それはGROUP_BY句が必要でした。それ以外の場合は、結果ごとにすべての結果タグIDを配置していました。最終的なクエリは次のようになりました。
SET SESSION group_concat_max_len = 1000000;
SELECT
music.*,
artwork.url_path as artwork_url_path,
GROUP_CONCAT(linkages.tag_id, ':', linkages.table_name) as tags
FROM music
LEFT JOIN artwork ON artwork.id = music.artwork
LEFT JOIN linkages ON music.id = linkages.track_id
WHERE music.id IN('1356', '1357', '719', '169', '170', '171', '805')
GROUP BY music.id
ORDER BY FIELD(music.id,1356,1357,719,169,170,171,805);
あなたのテーブルのスキーマを共有してください。あなたのデータには、* music.id *ごとに複数の* linkages.track_id *がありますか? –
ありがとう、私は作業している2つのテーブルの構造を投稿しました。 – jpea