2012-01-26 42 views
0

表(條紋不必要的cols):查找給出PK和下一個和前一行的位置爲一個結果行中的問題

car_id INT(11) PK 
url VARCHAR(100) 
signup TIMESTAMP 

默認列表查詢看起來像:

SELECT car_id, url FROM car ORDER By signup DESC 

現在我需要在列表查詢中查找結果集中汽車的位置。以及上一行和下一行的網址。

我已經嘗試了很多不同的方法,我終於不知道它是否可能。 (在一個查詢中)。

任何幫助查詢或指向正確的方向將非常感激。

編輯:

所期望的結果將是:

pos, nextid, nexturl, previd, prevurl 

回答

1

嘗試這一個 -

+行位置

SELECT car_id, url, signup, CONCAT(pos1, '/', @p1) position FROM (
    SELECT 
    c.*, 
    @p1:[email protected]+1 pos1, 
    @p2:=IF(car_id = 3 AND @p2 IS NULL, @p1, @p2) 
    FROM 
    cars c, 
    (SELECT @p1:=0, @p2:=NULL) t 
    ORDER BY 
    signup 
) t 
WHERE 
    pos1 BETWEEN @p2 - 1 AND @p2 + 1 

您寫道: 期望的結果將是:POS機,nextid,nexturl,previd,prevurl

嘗試此查詢:

SELECT 
    @p2 pos, 
    MAX(IF(pos1 > @p2, car_id, NULL)) nextid, 
    MAX(IF(pos1 > @p2, url, NULL)) nexturl, 
    MAX(IF(pos1 < @p2, car_id, NULL)) previd, 
    MAX(IF(pos1 < @p2, url, NULL)) prevurl 
FROM (
    SELECT 
    c.*, 
    @p1:[email protected]+1 pos1, 
    @p2:=IF(car_id = 3 AND @p2 IS NULL, @p1, @p2) 
    FROM 
    cars c, 
    (SELECT @p1:=0, @p2:=NULL) t 
    ORDER BY 
    signup 
) t 
WHERE 
    pos1 BETWEEN @p2 - 1 AND @p2 + 1 
+0

查詢本身的作品,但我沒有得到行的位置只有行本身。它用於在頁面上導航,以允許瀏覽頁面。其顯示爲< 15/280 >。 15將是問題查詢中行的位置。你在回答中所涉及的下一個和前一個行。 – Rufinus

+0

...我看到了你想要的結果。該查詢應該被重寫。 – Devart

+0

看看第二個查詢。 – Devart

0
(SELECT car_id, url FROM car WHERE car_id = ?) 
UNION 
(SELECT car_id, url FROM car WHERE signup > (SELECT signup FROM car WHERE car_id = ?) ORDER By signup ASC LIMIT 1) 
UNION 
(SELECT car_id, url FROM car WHERE signup < (SELECT signup FROM car WHERE car_id = ?) ORDER By signup DESC LIMIT 1) 
+0

犯規找到給定pk的位置,就像它在列表查詢中一樣。但無論如何感謝您的幫助。 – Rufinus

0
SELECT 
    @previd AS previousid, 
    @prevurl AS previousurl, 
    @previd:[email protected] AS currentid, 
    @prevurl:[email protected] AS currenturl, 
    @id:=car_id AS nextid, 
    @url:=url AS nexturl 
FROM 
    (SELECT @previd:=0) AS initprevid, 
    (SELECT @prevurl:='') AS initprevurl, 
    (SELECT @id:=0) AS initid, 
    (SELECT @url:='') AS initurl, 
    car 
WHERE currentid=<whatever> 
ORDER BY 
    car.signup DESC 

您可以過濾掉虛假currentid = 0

相關問題