在标签上搜索时如何获得包含所有标签的文章?

时间:2017-01-24 03:39:03

标签: php mysql

我有这样的查询:

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')

1 个答案:

答案 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

在这里演示:

SQLFiddle