2015-12-03 56 views
-2

我正在運行一個社交網站,我正在尋找新的和更聰明的方式來輸出帖子。聰明的飼料結果| MySQL

數據庫表例如:

id [INT] 
message [LONGTEXT] Default NULL 
attachment [VARCHAR] Default NULL 
member_id [INT] 
likes [INT] default 0 
date [DATE] 
etc 

我理解,這是一個很模糊的例子,但我認爲這是足以問這個問題。

我該如何編寫一個MySQL查詢來輸出只有附件(無消息)的3個帖子,後面跟着一條消息(沒有附件),後面跟着6個帖子,其中最喜歡的數字是「likes」,那麼重複這個過程直到達到LIMIT?

我明白我可能會問了很多,所以這個任何變化將非常感激。此外,任何相關內容的鏈接也會有很多幫助。非常感謝你。

+0

沒什麼可說實話的。我花了數天的時間搜索和谷歌搜索解決方案,但我找不到任何東西。 – Tom

+1

在網站的腳本語言的循環中運行3個查詢不是更容易嗎? – Kenney

+0

@Kenney真的,但我想限制查詢的數量,希望嘗試在一個查詢中完成所有操作 – Tom

回答

0

這裏是做一個笨方法:

像@Kenney建議您可以使用工會合並3套。在應用聯合之前,我們需要按照我們想要的方式排序每個集合,併爲每個集合中的每一行添加一個row_id。施加聯合之後,我們可以命令由

  • floor(row_id/divisor)的結果,所以第一3項中的第一組,在第二組第一1項,第一項6在第三組評價在第0位。下一個3項設置,第二組中的下一個項目,以及第三組中的下6個項目評估爲1,依此類推。

  • type_id,所以第一組出現第二組前前第三套

我敢肯定,這是低效的。

SELECT * 
FROM (
    (SELECT *, @i:[email protected]+1 row_id, 1 type_id, 3 divisor 
    FROM mytable a 
    JOIN (SELECT @i := 0) b 
    WHERE attachment IS NOT NULL AND message IS NULL) 
    UNION ALL 
    (SELECT *, @j:[email protected]+1 row_id, 2 type_id, 1 divisor 
    FROM mytable a 
    JOIN (SELECT @j := 0) b 
    WHERE attachment IS NULL AND message IS NOT NULL) 
    UNION ALL 
    (SELECT *, @k:[email protected]+1 row_id, 3 type_id, 6 divisor 
    FROM mytable a 
    JOIN (SELECT @k := 0) b 
    WHERE !((attachment IS NOT NULL AND message IS NULL) OR (attachment IS NULL AND message IS NOT NULL)) 
    ORDER BY likes DESC)) a 
ORDER BY FLOOR(row_id/divisor), type_id;