我有两个名为集合和帖子的表。我需要显示集合名称和用户收集的每个集合中的3个帖子。有些收藏的帖子少于3个,有些则根本没有帖子。此外,我需要计算帖子(不是帖子的总数,而是查询产生的帖子)
MySQL表
集合
| collection_id | collection_name | uid |
| 1 | My collection 01 | 1 |
| 2 | My collection 02 | 1 |
| 3 | My collection 03 | 1 |
| 4 | My collection 04 | 2 |
| 5 | My collection 05 | 2 |
| 6 | My collection 06 | 1 |
帖子
| posts_id | post_title | cid |
| 1 | post title 1 | 1 |
| 2 | post title 2 | 1 |
| 3 | post title 3 | 1 |
| 4 | post title 4 | 3 |
| 5 | post title 5 | 2 |
| 6 | post title 6 | 3 |
cid是集合ID。所以我想要的是uid是用户ID。我想要显示结果
3 posts from My collection 01
post title 1
post title 2
post title 3
1 posts from My collection 02
post title 5
2 posts from My collection 02
post title 4
post title 6
根据我在上表中添加的虚拟数据做了例子 我尝试使用左连接但没有运气
SELECT * FROM collections LEFT JOIN posts ON posts.cid= collections. collection_id WHERE posts ON posts.cid= collections. collection_id AND collections. uid=1 ORDER BY collections. collection_id DESC LIMIT 0, 16
通过此查询,我可以获得集合名称和1个帖子。
但是,如果我运行两个查询,它将起作用(1在另一个内)
SELECT * FROM collections WHERE uid=1 ORDER BY collection_id DESC LIMIT 0, 16
然后我得到集合id并在上面的查询循环中运行另一个查询
SELECT * FROM posts WHERE cid=$collection_id ORDER BY post_id DESC LIMIT 0, 3
我真的很喜欢用一个查询来做。非常感谢您的帮助。
答案 0 :(得分:0)
没有简单的方法可以做到这一点。也许有非常复杂的查询,但它很难维护,并且可能比使用几个更简单的查询更有效率。
您描述的解决方案当然要花费1 +(类别数量)查询,而不是两个。您可以轻松地将它们联合起来,然后您将有两个查询并且数据库的行程更少,但db的负载相似(与您的解决方案相比)。
即使您假设有一种方法可以通过单个查询获取所有内容,那么db必须执行几乎相同的工作(从每个类别中获取3个最新帖子)。因此,在性能方面,对于1个假设进行2次查询并不是一个很大的惩罚。而且,我可以想象数据库引擎在查找最佳执行计划方面可能存在一些问题,特别是如果你要添加函数等。
最后的解决方案。有一种方法可以从每个类别中获取最多3个帖子,但这需要修改模式和一些应用程序方面的工作。你可以添加一个布尔列" most_recent"并且每只猫总共有3个帖子。其余为true
,其余为假。每次添加/删除帖子时都必须不断更新。使用db触发器也可以实现这一点。那么你的问题很容易解决,但只是因为你做了一些预计算。