簡體   English   中英

SQL - 在給定特定WHERE子句的情況下查找下一行和上一行

[英]SQL - find next and previous rows given a particular WHERE clause

我有一個名為bb_posts的MySQL表,由bbPress論壇使用。 它有一個名為topid_id的自動增量字段和另一個名為topic_poster的字段。

我正在嘗試編寫一個找到“同一作者的下一篇文章”的函數。 因此,例如,假設用戶位於顯示主題123的特定頁面上。如果您執行SQL查詢:

SELECT *
FROM `bb_topics`
WHERE `topic_poster` = 5
ORDER BY `topic_id` ASC

這可能會返回以下行:

topic_id    topic_poster
6           5
50          5
123         5
199         5
2039        5

我想做的是寫一個返回這兩行的SQL查詢:

topic_id    topic_poster
50          5
199         5

這將是具有topic_id為123的行的PRIOR行,以及該行的AFTER行。

如果在一個查詢中執行此操作太難了,那么將其分解為兩個查詢肯定是可以的...

我想避免做整個SQL查詢(“SELECT * FROM bb_topics WHERE topic_poster = 5”)並循環遍歷結果,因為結果集有時很大。

這可能嗎? :-)

下一個:

SELECT * FROM `bb_topics` 
      WHERE `topic_id` = 
      (select min(`topic_id`) FROM `bb_topics` where `topic_id` > 123
         and `topic_poster` = 5)

前一個:

SELECT * FROM `bb_topics` 
      WHERE `topic_id` = 
      (select max(`topic_id`) FROM `bb_topics` where `topic_id` < 123
         and `topic_poster` = 5)

都:

SELECT * FROM `bb_topics` 
      WHERE `topic_id` = 
      (select min(`topic_id`) FROM `bb_topics` where `topic_id` > 123
                     and `topic_poster` = 5)
      or `topic_id` = 
      (select max(`topic_id`) FROM `bb_topics` where `topic_id` < 123
                        and `topic_poster` = 5)

看看這個老問題

我的猜測是,帶有LIMIT 1的UNION比我在這里的答案中的聚合更好。

注意:在downvoting之前,請閱讀評論和問題的第一個修訂;-)

根據定義,RDBMS表上的數據不是有序的 這意味着當您運行查詢時,如果未指定ORDER BY子句,則順序可以從一個查詢到另一個查詢不同。 此外,您必須考慮下一個查詢將(或至少可能)返回不同的順序

假設可能是數據庫上的另一個用戶插入新記錄,並且RDBMS認為將它放在您正在考慮的行之間。 或者DBA在線基礎上將表移動到另一個表(例如,這在Oracle中是可能的),在這種情況下,可以在任何情況下更改數據。

對於您的問題,您必須構建一種查詢結果緩存,以確定查詢的上一行和下一行。

這是實現這一目標的一種微妙但有效的方法,它甚至適用於不支持子查詢的舊版MySQL -

 SELECT * FROM bb_topics AS bb1 LEFT JOIN bb_topics AS bb2 ON bb1.topic_poster = bb2.topic_poster AND bb2.topic_id > bb1.topic_id LEFT JOIN bb_topics AS bb3 ON bb1.topic_poster = bb3.topic_poster AND bb3.topic_id > bb1.topic_id AND bb3.topic_id < bb2.topic_id WHERE bb1.topic_poster = 5 AND bb3.topic_id IS NULL 

這將使您獲得下一個相鄰的帖子。 如果不明確的話,我可以填寫下一篇文章的對稱條款。

編輯 - 小修正alii。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM