php - SQL 一条语句查询出文章和对应的文章标签
高洛峰
高洛峰 2017-04-17 16:51:39
[MySQL讨论组]
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(6)
PHPz
SELECT
  id,
  title,
  content,
  tag
FROM article_table
  LEFT JOIN (SELECT
               article_id,
               group_concat(tag_name) AS tag
             FROM tag_table GROUP BY article_id) AS tag_data ON id = article_id;

这个是批量查询的,单条你自己加一下article_id的限制就行了

如果你只是查询一个article_id的话,article_id加上索引之后这里没有任何的性能问题,不要听下面看过几页书(子查询会降低查询效率)的人就来说什么性能问题。

PHP中文网

楼上的这位兄台,你查询的这个数据,明显不对啊!
实话告诉你吧,如果你真的想一条语句搞定,别说实现不了,就算实现了,效率也很低,其实,直接一条语句,不会出这个数据格式的数据的,别想了。建议再查一次tag标签信息。

迷茫

建议分两次查询,查询出文章信息再循环获取标签,这样对性能方面会好一些。如果数据过大可以使用缓存,来存储数据

迷茫
select t1.id,t1.title,t1.content,group_concat(t2.tag_name) tags 
  from article t1 left join tag t2 on t1.id=t2.article_id
  where t1.id=1
  group by t1.id

标签表tag要根据article_id建索引,这样的效率不会低到哪里

PHP中文网

支持@abul的答案,题主要求的是一条sql查出需要的结果

select t1.id,t1.title,t1.content,group_concat(t2.tag_name) tags 
  from article t1 left join tag t2 on t1.id=t2.article_id
  where t1.id=1
  group by t1.id;

PS:这样的需求只针对结果集较少的情况,线上应该只是展示给用户的一个或10个文章列表加标签,而对于楼上小伙伴讨论的数据量大了以后的问题,如果只是取出几条文章及标签展示给用户,我们只需要取出这部分文章id再关联标签表取出标签即可,索引建好效率不会差,再有热门文章标签数据我们也完全可以放到缓存中。但是如果要统计所有文章标签的话,这就属于生成报表了,这应该是不对前端用户开放的,只需要后台报表库跑起来就好,也不用担心效率问题影响到用户体验!So。。题主自己选好了

ringa_lee

必须重新整合数据结构,楼上说的有道理

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号