我有这样的查询:
select ...,
group_concat(tag.string separator '|') as tags
from article a
left join articletag on a.id = articletag.a_id
left join tag on tag.id = articletag.t_id
where /* OR product of (column like %term%) */
group by a.id
问题是,当标签上发生匹配时,它会破坏我的分组'并且只返回一行。
如果没有巨大的性能损失,如何在至少1行匹配时获得整个组?
示例:
article
id | title | content
2 | article 2 | long content
tag
id | string
1 | tag 1
2 | tag 2
4 | tag 4
articletag
a_id | t_id
2 | 1
2 | 2
2 | 4
当包含(2, 'article 2', 'long content', 'tag 1')
时,当前查询将返回tag.string like '%tag 1%'
。
(2, 'article 2', 'long content', 'tag 1|tag 2')
时或'tag 2'
我想获得(2, 'article 2', 'long content', 'tag 1|tag 2|tag 4')
答案 0 :(得分:2)
您当前的方法存在的问题是,您要按id
表的article
列进行分组,但是您还在使用GROUP BY
时选择非汇总记录。这有点隐藏在您的原始查询中,因为您只有省略号...
,但问题就出现了。
相反,在单独的子查询中计算管道分隔的标记字符串,然后将其连接回article
表:
SELECT t1.*, t2.tags
FROM article t1
LEFT JOIN
(
SELECT at.a_id,
GROUP_CONCAT(COALESCE(t.string, 'NA') ORDER BY t.string SEPARATOR '|') AS tags
FROM articletag at
LEFT JOIN tag t
ON at.t_id = t.id
GROUP BY at.a_id
) t2
ON t1.id = t2.a_id
在这里演示: