SELECT a.title, a.content, c.content
FROM
(SELECT article_id, title, content FROM article LIMIT 100) a
LEFT JOIN
(
SELECT article_id, content
FROM comment c1
WHERE (
SELECT COUNT(*)
FROM comment c2
WHERE c2.article_id = c1.article_id AND c2.comment_id >= c1.comment_id
) <= 3
) c ON a.article_id = c.article_id
ORDER BY a.article_id DESC, c.comment_id ASC
首先,使用子查询获取最新发布的100篇文章,限制显示数量不超过100篇,以提高查询效率。
然后,使用左连接将文章和评论合并起来,并使用子查询获取每篇文章的最新3条评论。
最后,按照文章 id 降序排列,评论 id 升序排列,确保结果集中的评论是最新的前三条。
需要注意的是,以上 SQL 语句仅供参考,具体实现还需要针对实际情况进行调整和优化。同时,还需要注意索引和缓存的使用以提高查询效率。
Db::table('table')->limit(100)->select();
不行吗
还要获取评论的
作缓存定时更新吧
先优化数据库方面的
如果做缓存定时更新,就算n+1次查询又如何
百万级能有多大,就算用1最坏情况也就是1+100个查询,DB索引和缓存得当这都不是问题
哈哈, 上个项目, 才几个月600w条了
基础消耗是摆在那里(假定单条查询全都走了索引),就算你怎么个去考虑如何写,最终的基础消耗都差不多,与其在这个地方扣细节(我看你已经纠结了好多天了),不如在其他的地方考虑如何去降低使用基础消耗的频次(比如缓存)
换我就想都不用想直接第一种+缓存简单直接,别看它土但是有效啊,花时间琢磨些奇技淫巧最后发现浪费了时间却没卵用..
你这个是文章,不是高频交易,实时性没有那么重要
laravel ORM 伪代码
循环查库啊
是啊,有什么问题么?
不要觉得我这个土,主表38个字段,2500万数据,关联表41个字段,6600万数据,都走索引的情况下,用上面的方式执行时间100ms左右
laravel ORM 中的with去查询评论呢?
我用的就是这个查询, 好像获取评论也是一次性获取所有的
可以在with的方法里面可以用条数限制
with 里面有个take, 好像是先拿出所有的, 然后截断
1.App一次性无法显示100条,可以做成滚动加载模式
2.异步加载每条的评论
关键看数据库表设计,以及app产品的设计。
说得对
sql或者orm层面没有什么好的方案,可以如果是mysql8,可以使用窗口函数row_number和over试试,但是缓存是最佳的方案
我想也是, 我觉得子查询好像可以
使用Laravel ORM如下
手动拼接成union all 语句,然后一条去sql去数据库查询,其他条件自己拼接即可
这多明显,app显示满根本显示不了100条,你这做个分页,下拉加载就行了
不考虑反查最新评论,获取300条最新评论的还有关联的文章记录,在用PHP整合一下就完事了么?[狗头]
首先,需要在文章表和评论表之间建立一对多的关联关系,即在评论表中引入一列文章 id(article_id),表示评论所属的文章。
假设文章表名为 article,具有 article_id、title、content 等列;评论表名为 comment,具有 comment_id、article_id、content 等列。
然后,使用以下 SQL 语句来查询文章和对应的最新3条评论:
首先,使用子查询获取最新发布的100篇文章,限制显示数量不超过100篇,以提高查询效率。
然后,使用左连接将文章和评论合并起来,并使用子查询获取每篇文章的最新3条评论。
最后,按照文章 id 降序排列,评论 id 升序排列,确保结果集中的评论是最新的前三条。
需要注意的是,以上 SQL 语句仅供参考,具体实现还需要针对实际情况进行调整和优化。同时,还需要注意索引和缓存的使用以提高查询效率。
查询出文章然后循环拼接查询评论的sql union all
如: