2008-10-03 26 views
5

http://thedailywtf.com/Articles/The-Hot-Room.aspxMySQL的:有條件選擇下一個和前行

你看怎麼樣在底部有是鏈接到下一個和以前的文章中(「措手不及Divide_By_Zero」和「完全不同的遊戲」)?我該怎麼做,但選擇下一個和以前的非私人文章?這適用於選擇下一篇文章:

SELECT * FROM articles WHERE id > ? AND private IS NULL 

但我找不到方法來選擇以前的文章。

什麼是正確的/有效的方式在一個查詢中要做到這一點,最好是?

回答

9

或延長傑里米的答案...
在一個查詢

(SELECT * FROM articles WHERE id > ? 
AND private IS NULL 
ORDER BY id ASC LIMIT 1) 
UNION 
(SELECT * FROM articles WHERE id < ? 
AND private IS NULL 
ORDER BY id DESC LIMIT 1) 
+2

這一個執行怪異。它只返回一條記錄,但我找不到找出哪條記錄的方法。 – Fuzzy76 2010-08-08 17:06:36

5

這是我會怎麼做:

-- next 
SELECT * FROM articles WHERE id > ? AND private IS NULL ORDER BY id ASC LIMIT 1 

-- previous 
SELECT * FROM articles WHERE id < ? AND private IS NULL ORDER BY id DESC LIMIT 1 

我不知道怎麼做,在一個查詢。我能想到的唯一可能是在一個查詢中同時顯示您正在顯示的文章和下一篇文章,但這可能太令人困惑。

2

如何嵌套查詢?

SELECT * FROM articles WHERE id IN (
    SELECT id FROM articles WHERE id > ? AND private IS NULL ORDER BY id ASC LIMIT 1) 
) 
OR id IN (
    SELECT id FROM articles WHERE id < ? AND private IS NULL ORDER BY id DESC LIMIT 1 
); 
2

你可以逃脫你的具體情況子選擇等,但如果你有什麼需要更復雜(例如:給出一個初始餘額和支付和退款的名單,在每個時間點計算賬戶餘額)你可能會想編寫一個使用SQL REPEAT/WHILE/LOOP子句的存儲過程並允許使用變量等等。當你在你選擇的第一個/最後一個記錄