从左连接查询获得更多结果

时间:2016-05-22 18:02:58

标签: php mysql left-join

我有两个名为集合和帖子的表。我需要显示集合名称和用户收集的每个集合中的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 

我真的很喜欢用一个查询来做。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

没有简单的方法可以做到这一点。也许有非常复杂的查询,但它很难维护,并且可能比使用几个更简单的查询更有效率。

您描述的解决方案当然要花费1 +(类别数量)查询,而不是两个。您可以轻松地将它们联合起来,然后您将有两个查询并且数据库的行程更少,但db的负载相似(与您的解决方案相比)。

即使您假设有一种方法可以通过单个查询获取所有内容,那么db必须执行几乎相同的工作(从每个类别中获取3个最新帖子)。因此,在性能方面,对于1个假设进行2次查询并不是一个很大的惩罚。而且,我可以想象数据库引擎在查找最佳执行计划方面可能存在一些问题,特别是如果你要添加函数等。

最后的解决方案。有一种方法可以从每个类别中获取最多3个帖子,但这需要修改模式和一些应用程序方面的工作。你可以添加一个布尔列" most_recent"并且每只猫总共有3个帖子。其余为true,其余为假。每次添加/删除帖子时都必须不断更新。使用db触发器也可以实现这一点。那么你的问题很容易解决,但只是因为你做了一些预计算。