Найти позицию данного ПК, а также следующую и предыдущую строку как одну строку - PullRequest
0 голосов
/ 26 января 2012

Таблица в вопросе (полосатые ненужные столбцы):

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

Запрос списка по умолчанию выглядит следующим образом:

SELECT car_id, url FROM car ORDER By signup DESC

Теперь мне нужно найти позицию автомобиля в наборе результатовкак это было бы в запросе списка.И URL предыдущего и следующего ряда.

Я пробовал много разных подходов, и я, наконец, не уверен, возможно ли это.(в одном запросе).

Любая помощь с запросом или указателями в правильном направлении будет принята с благодарностью.

РЕДАКТИРОВАТЬ:

желаемыйрезультат будет:

pos, nextid, nexturl, previd, prevurl

Ответы [ 3 ]

1 голос
/ 26 января 2012

Попробуйте это -

+ позиция строки

SELECT car_id, url, signup, CONCAT(pos1, '/', @p1) position FROM (
  SELECT
    c.*,
    @p1:=@p1+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:=@p1+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 голосов
/ 26 января 2012
SELECT
  @previd AS previousid,
  @prevurl AS previousurl,
  @previd:=@id AS currentid,
  @prevurl:=@url 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

Вы можете отфильтровать паразитный ток = 0

0 голосов
/ 26 января 2012
(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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...