MySQL三表标签系统如何查询最新10篇发布文章及对应所有关联标签
MySQL标签系统多标签查询解决方案
你可以使用MySQL的GROUP_CONCAT聚合函数实现单条记录返回所有关联标签,同时配合子查询先限定最新10篇文章,保证查询性能,无需PHP二次处理。
最优性能查询语句
SELECT p.id, p.title, p.datetime, -- 拼接所有关联标签,可自定义分隔符 GROUP_CONCAT(t.tag ORDER BY t.tag SEPARATOR ',') AS tags, GROUP_CONCAT(t.slug ORDER BY t.tag SEPARATOR ',') AS tag_slugs FROM -- 先子查询取最新10篇符合条件的文章,避免全表关联性能损耗 (SELECT id, title, datetime FROM posts WHERE datetime <= NOW() ORDER BY id DESC LIMIT 10) p LEFT JOIN tagsmap tm ON p.id = tm.id LEFT JOIN tags t ON tm.tag = t.id GROUP BY p.id, p.title, p.datetime
方案说明
- 先通过子查询拿到最新10篇文章,子查询直接走posts表主键索引,查询效率极高,避免了先关联全量数据再截取10条的冗余计算
GROUP_CONCAT函数会将同一文章下的所有标签拼接为单个字符串,SEPARATOR可以自定义分隔符(如果标签内容包含逗号,可替换为|等特殊符号,后续拆分时不会冲突)- 分组字段包含子查询返回的所有非聚合字段,符合SQL模式规范,不会出现兼容报错
注意事项
如果单篇文章关联标签较多,可能出现内容截断问题,可以在执行查询前先执行会话级参数设置调整最大长度:
SET SESSION group_concat_max_len = 10240; -- 单位为字节,可根据实际需求调整
内容的提问来源于stack exchange,提问作者AbsoluteBeginner
相关产品推荐
相关产品推荐

