2016-05-22 36 views
2

我有2個名爲集合和帖子的表。我需要顯示用戶收集的每個集合的集合名稱和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

有沒有簡單的方法來做到這一點。也許對於非常複雜的查詢,但是維護起來很困難,甚至可能比用幾個更簡單的查詢來做效率更低。

您所描述的解決方案當然需要1 +(類別數量)查詢,而不是兩個。你可以很容易地將它們聯合起來,然後你會有兩個查詢,而且數據庫的行程更少,但是db的負載相似(與你的解決方案相比)。即使你假設,有一種方法可以用單個查詢獲取所有東西,那麼db必須做幾乎相同的工作(從每個類別獲取3個最新的帖子)。因此,有兩個查詢與1個假設在性能方面並不是很大的懲罰。此外,我可以想象,數據庫引擎可能會遇到一些問題,尋找最佳執行計劃,特別是如果你會添加功能等。

而最後的解決方案。有一種方法可以從每個類別獲取最多3篇文章,但需要修改模式和一些應用程序方面的工作。你可以添加一個布爾列「most_recent」,並且每隻貓總是有3篇文章。與true和其餘的假。每次添加/刪除帖子時,您都必須不斷更新它。用db觸發器也是可以實現的。然後,你的問題是微不足道的解決,但只是因爲你已經做了一些預先計算。

相關問題