MySQL - group_concat 引入更多不正确的数据
MySQL - group_concat pulling in additional incorrect data
我在使用 JOIN
和 GROUP_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_id
s 和 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
我在使用 JOIN
和 GROUP_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_id
s 和 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