MySQL - group_concat 引入更多不正确的数据

MySQL - group_concat pulling in additional incorrect data

我在使用 JOINGROUP_CONCAT 时遇到了问题。查询正在串联不应与联接关联的其他数据。

这是我的 table 结构:

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_ids 和 table_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);

您的 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