2017-04-12 3 views
0

JOINGROUP_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_idtable_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); 
+0

あなたのテーブルのスキーマを共有してください。あなたのデータには、* music.id *ごとに複数の* linkages.track_id *がありますか? –

+0

ありがとう、私は作業している2つのテーブルの構造を投稿しました。 – jpea

答えて

0

joinが重複する行を生成しています。問題の根本原因を修正することをお勧めします。しかし、間に合わせと-ソリューションはgroup_concat(distinct)を使用することです:

GROUP_CONCAT(DISTINCT linkages.tag_id) as tag_ids, 
GROUP_CONCAT(DISTINCT linkages.table_name) as table_name 

あなたはGROUP_CONCAT()を使用して単一のフィールドの列を置くことができます。

GROUP_CONCAT(DISTINCT linkages.tag_id, ':', linkages.table_name) as tags 
+0

ありがとうございます。私は、多次元配列としてtag_idsとtable_nameの結果を一致させる必要があるため、distinctを使用することはできません。どのように結合を修正するための任意のアイデア? – jpea

+0

方向をありがとう。私はそれを解決し、元の質問に更新を掲載しました。 – jpea

関連する問題