2013-10-23 46 views
0

我有一個看起來像這樣(與非重要的列的表省略某些參數選擇下一個和以前的ID

`pictures` (
    `picture_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `picture_title` varchar(255) NOT NULL, 
    `album_id` int(10) unsigned DEFAULT NULL, 
    `authenticated` tinyint(4) DEFAULT '0', 
    `approved` tinyint(4) DEFAULT '0' 
) 

我想要做的是讓下一個和上證和經批准picture_id 。有一個問題,雖然 - 這發生要麼必須有picture_id = album_idalbum_id IS NULL

下面就容易描述我想達到的目標圖像標記http://i.imgur.com/xTaEhwt.png

列紅色爲w。我想要選擇的帽子,綠色標記的是我擁有的picture_id,並且希望找到下一個/上一個ID。請注意,它跳過picture_ids 2 < 9,因爲它具有不等於其picture_id的album_id,並且它跳過picture_id 11,因爲它沒有通過認證/批准。

我該如何做到這一點?我無能爲力。

編輯:重述了一下

+0

只要寫兩個查詢:一個是前面的條目,一個用於以下項目,分別使用合適的'ORDER BY ID DESC'或'ORDER BY ID ASC',加上' LIMIT 1',你有你的上一個和下一個值。如果你想讓他們在1個查詢中,只需'聯合'他們。 – Wrikken

+0

您不能在** Related **問題中使用解決方案嗎? – Barmar

回答

1

你可以使用一個簡單的聯合查詢,在那裏你採取以下考慮:

  • 畫中游您的ID相符。
  • 先前的圖片符合您的條件PLUS其ID較低,但是來自表格下部的最高ID。
  • 下一張照片與您的conditons相匹配PLUS其ID較高,但是表格的上半部分是最低的ID。

檢查這個(注ID 2越來越跳過,因爲它不符合 「ID =唱片或專輯= NULL」 contraint。):

看到這個小提琴:http://sqlfiddle.com/#!2/42ce6/17

(SELECT 
    * 
    FROM 
    pics 
    WHERE 
    id = 10 
) -- target id image 
UNION 
    (
    SELECT 
    * 
    FROM 
    pics 
    WHERE 
    id < 10 AND 
    authenticated = 1 AND 
    approved = 1 AND 
    (id = album OR ISNULL(album)) 
    ORDER BY id DESC LIMIT 0,1 
) -- highest id of lower part 
UNION 
    (
    SELECT 
    * 
    FROM 
    pics 
    WHERE 
    id > 10 AND 
    authenticated = 1 AND 
    approved = 1 AND 
    (id = album OR ISNULL(album)) 
    ORDER BY id ASC LIMIT 0,1 
) -- loweste id of upper part 
    ORDER BY id 

將表格的「上部」部分和「下部」限制爲1完全匹配您想要獲取的2個條目。

輸出:

ID TITLE ALBUM AUTHENTICATED APPROVED 
1 My fav 1 1 1 
10 test 2 (null) 1 1 
12 Holiday pictures (null) 1 1 
相關問題