MySQL 中有用户表和评论表,如何获取用户表所有内容 + 每个用户最后一条评论内容(如果存在的话)

环境:
1.测试环境:win10,wamp
2.生产环境:windows server 2016,wamp

MySQL中有两张表:
1.user
2.comments

1.user的结构为:
用户id 姓名 年龄 地址
 id name age addr

2.comments的结构为:
评论id 用户id 评论内容 评论时间
 id user_id comments c_time

说明:用户-评论 为 1-N,一个用户有多条评论

需求:
我现在需要取出user的所有内容,以及每个用户的最后一条评论内容、评论时间(如果有的话),方便按评论时间来进行排序

问题:
我用了join语句,语句如下:

SELECT * from user as a left join (SELECT user_id,comments,c_time FROM comments WHERE c_time IN (SELECT MAX(do_time)FROM comments GROUP BY user_id)) as b on a.id=b.user_id order by b.comments desc,b.do_time desc,a.login_name asc

在测试环境里面没有问题,10万级别的数据也是很快就取出来了,结果在生产环境里面就不行,一执行就一直转圈,一直等待MySQL最大执行时间360后才停止。

请问:
1.上面我写的语句有什么问题吗?
2.要实现这个功能,最好应该怎么办呢?

讨论数量: 2

这种场景建议冗余一个字段用来存储用户的最后评论数据; 如果你实在不想在user表加冗余字段,你可以建立一张相关表来存储,比如user_last_comment 建议冗余是因为这种场景,插入比这样查询的开销要低得多,所以不建议在查询上纠结;

3年前 评论

提个建议,假设你只有主键索引,那么你用 c_time IN (SELECT MAX(do_time) 不如改成 id IN (SELECT MAX(id)

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!