MySQL:有条件地选择下一行和上一行

时间:2008-10-03 23:04:47

标签: mysql

http://thedailywtf.com/Articles/The-Hot-Room.aspx

你看到底部是如何链接到下一篇和前一篇文章(“Unprepared For Divide_By_Zero”和“完全不同的游戏”)?我该怎么做,但选择下一篇和以前的非私人文章?这适用于选择下一篇文章:

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

但我找不到选择上一篇文章的方法。

执行此操作的正确/有效方法是什么,最好是在一个查询中?

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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 :(得分: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
);

答案 3 :(得分:2)

您可以在特定情况下使用子选择等,但如果您需要更复杂的内容(例如:给定初始余额以及付款和退款列表,在每个时间点计算帐户余额)您可能会想编写一个使用SQL REPEAT / WHILE / LOOP子句的存储过程,并允许使用变量等。

相关问题