2008-10-03 48 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子句的存储过程并允许使用变量等等。当你在你选择的第一个/最后一个记录