2012-01-26 1 views
0

表(ストライピング不要なCOLS)を与えられたPKと次と前の行の位置を探しますリスト照会にあるように結果セット内の車の位置を見つける。前の行と次の行のURL。1つの結果行として問題になっている

私は多くの異なるアプローチを試みましたが、最終的に可能かどうかはわかりません。 (1つのクエリで)。

正しい方向への質問や指針に関する助けをいただければ幸いです。

EDIT:

所望の結果は次のようになります。

pos, nextid, nexturl, previd, prevurl 

答えて

1

はこの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

2番目のクエリを見てください。 – 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

doesntの指定された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

関連する問題