我遇到了JOIN
和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
是正确的,但15
不应该存在,与其他一些数字类似 - 71
等等。我可以'使用DISTINCT
因为我需要将tag_id
和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);
答案 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