MySQL - group_concat引入额外的错误数据

时间:2017-04-12 12:02:51

标签: mysql sql join group-concat

我遇到了JOINGROUP_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是正确的,但15不应该存在,与其他一些数字类似 - 71等等。我可以'使用DISTINCT因为我需要将tag_idtable_name结果与结果中的多维数组匹配。

有关为何的想法?

更新: 我最终在戈登的最初推动下解决了这个问题。它需要一个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);

1 个答案:

答案 0 :(得分: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