2009-08-11 6 views
12
 
id | photo title  | created_date 

XEi43 | my family  | 2009 08 04 
dDls | friends group | 2009 08 05 
32kJ | beautiful place | 2009 08 06 
EOIk | working late | 2009 08 07 

Скажем, у меня есть идентификатор 32kJ. Как я получу следующую строку или предыдущую?sql вытягивание ряда для следующего или предыдущего ряда текущего ряда

+0

Концепция «следующий» или «предыдущий» зависит от порядка. Возможно, вы можете сделать это программно, путем извлечения DataSet с использованием ado.net или другой технологии, а затем зацикливания записей этого представления данных. – pvieira

+1

Это легко выполнимо, если ваше поле id было последовательным и числовым, факт, что вы используете алфавитные символы, делает его намного сложнее. http: // www.scottklarr.com/topic/111/how-to-select-previousnext-rows-in-mysql/ –

ответ

17

Это то, что я использую для поиска предыдущих/следующих записей. Любой столбец в таблице могут быть использованы в качестве столбца сортировки, и не присоединяется или противных писаки требуются:

Следующая запись (дата больше, чем текущая запись):

SELECT id, title, MIN(created) AS created_date 
FROM photo 
WHERE created > 
    (SELECT created FROM photo WHERE id = '32kJ') 
GROUP BY created 
ORDER BY created ASC 
LIMIT 1; 

Предыдущая запись (дата меньше текущей запись):

SELECT id, title, MAX(created) AS created_date 
FROM photo 
WHERE created < 
    (SELECT created FROM photo WHERE id = '32kJ') 
GROUP BY created 
ORDER BY created DESC 
LIMIT 1; 

Пример:

CREATE TABLE `photo` (
    `id` VARCHAR(5) NOT NULL, 
    `title` VARCHAR(255) NOT NULL, 
    `created` DATETIME NOT NULL, 
    INDEX `created` (`created` ASC), 
    PRIMARY KEY (`id`) 
) 
ENGINE = InnoDB; 

INSERT INTO `photo` (`id`, `title`, `created`) VALUES ('XEi43', 'my family',  '2009-08-04'); 
INSERT INTO `photo` (`id`, `title`, `created`) VALUES ('dDls', 'friends group', '2009-08-05'); 
INSERT INTO `photo` (`id`, `title`, `created`) VALUES ('32kJ', 'beautiful place', '2009-08-06'); 
INSERT INTO `photo` (`id`, `title`, `created`) VALUES ('EOIk', 'working late', '2009-08-07'); 

SELECT * FROM photo ORDER BY created; 
+-------+-----------------+---------------------+ 
| id | title   | created    | 
+-------+-----------------+---------------------+ 
| XEi43 | my family  | 2009-08-04 00:00:00 | 
| dDls | friends group | 2009-08-05 00:00:00 | 
| 32kJ | beautiful place | 2009-08-06 00:00:00 | 
| EOIk | working late | 2009-08-07 00:00:00 | 
+-------+-----------------+---------------------+ 


SELECT id, title, MIN(created) AS next_date 
FROM photo 
WHERE created > 
    (SELECT created FROM photo WHERE id = '32kJ') 
GROUP BY created 
ORDER BY created ASC 
LIMIT 1; 

+------+--------------+---------------------+ 
| id | title  | next_date   | 
+------+--------------+---------------------+ 
| EOIk | working late | 2009-08-07 00:00:00 | 
+------+--------------+---------------------+ 

SELECT id, title, MAX(created) AS prev_date 
FROM photo 
WHERE created < 
    (SELECT created FROM photo WHERE id = '32kJ') 
GROUP BY created 
ORDER BY created DESC 
LIMIT 1; 

+------+---------------+---------------------+ 
| id | title   | prev_date   | 
+------+---------------+---------------------+ 
| dDls | friends group | 2009-08-05 00:00:00 | 
+------+---------------+---------------------+ 
+0

i havent попробовал, но я уверен, что это потянет результат, я просто задаюсь вопросом, какой из них более быстрый. – Basit

+0

Почему вы используете агрегированные функции, если вы уже заказали результаты и ограничили их до 1 строки? – PhoneixS

0

Ужасного хак - Мне не нравится это, но может работать ..

with yourresult as 
(
select id, photo_title, created_date, ROW_NUMBER() over(order by created_date) as 'RowNum' from your_table 
) 
-- Previous 
select * from yourresult where RowNum = ((select RowNum from yourresult where id = '32kJ') -1) 
-- Next 
select * from yourresult where RowNum = ((select RowNum from yourresult where id = '32kJ') +1) 

Это любое использование?

+0

будет ли он работать в mysql? – Basit

+0

, вероятно, нет, к несчастью. Это MS SQL. У меня был quik, который вчера думал о завтраке, но у меня не было много времени. У меня будет другой взгляд сегодня вечером. – Tikeb

+0

im get this error # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с вашим результатом как ( выберите photo_id, title, added_date, ROW_NUMBER() over (ord 'в строке 1 – Basit

2

Я понимаю, что вы используете MySQL, но только для справки, вот как вы могли бы сделать это, используя аналитические функции Oracle, опережение и запаздывание:

select empno, ename, job, 
    lag(ename, 1) over (order by ename) as the_guy_above_me, 
    lead(ename, 2) over (order by ename) as the_guy_two_rows_below_me 
from emp 
order by ename 

Я думаю, что есть причина, почему Oracle стоит денег и MySQL is free ... :-)

Эта страница показывает вам how to emulate analytic functions in MySQL.

+2

Вы получаете эти аналитические функции в Postgres 8.4 а также: p – araqnid

2

Вы хотите следующую/предыдущую строку по дате? Если это так, вы можете сделать это:

select MyTable.* 
from MyTable 
join 
    (select id 
    from MyTable 
    where created_date < (select created_date from MyTable where id = '32kJ') 
    order by created_date desc, id desc 
    limit 1 
) LimitedTable on LimitedTable.id = MyTable.fund_id; 
+0

thnk you .. я попробую это. – Basit

+0

jeremy stein, можете ли вы также рассказать мне, могу ли я проверить положение текущей строки из общих строк (показывая 6 из 100 строк), может ли этот запрос сделать это или мне нужно расширить запрос, если он расширится, то как и что мне делать? Я просто хочу знать позицию текущей строки из общих строк, поэтому я могу заставить ее работать со следующими и предыдущими .. поэтому пользователи знаю, где они находятся, например, на facebook. – Basit

+0

Я хочу добавить позиционирование для текущей строки, другой, затем следующий и предыдущий .. как я могу это сделать? http://stackoverflow.com/questions/2036425/little-complex-sql -row-postion – Basit

1

Использование Mike's MAX/MIN трюк мы можем сделать предыдущие \ следующие прыжки для всех видов вещей. Этот пример msAccess вернет предыдущее закрытие для каждой записи в таблице данных фондового рынка. Примечание: «< =» предназначен для выходных и праздничных дней.

SELECT 
    tableName.Date, 
    tableName.Close, 
    (SELECT Close 
     FROM tableName 
     WHERE Date = (SELECT MAX(Date) FROM tableName 
        WHERE Date <= iJoined.yesterday) 
    ) AS previousClose 
FROM 
(SELECT Date, DateAdd("d",-1, Date) AS yesterday FROM tableName) 
    AS iJoined 
INNER JOIN 
    tableName ON tableName.Date=iJoined.Date; 

... 'вчера' демонстрирует использование функции ( Дата-1) прыгать; мы могли бы просто использовали ...

(SELECT Date FROM tableName) AS iJoined 
    /* previous record */ 
(SELECT MAX(Date) FROM tableName WHERE Date < iJoined.Date) 
    /* next record */ 
(SELECT MIN(Date) FROM tableName WHERE Date > iJoined.Date) 

Хитрость заключается в том, мы можем предыдущий \ следующий # из любой (s) с MAX \ MIN и функции скачка()

0

Я считал идентификатор в качестве основного ключ в таблице (и как «номер строки»), и использовал ее для сравнения каждой записи с предыдущей записью. Следующий код должен работать.

CREATE SCHEMA temp 
create table temp.emp (id integer,name varchar(50), salary varchar(50)); 
insert into temp.emp values(1,'a','25000'); 
insert into temp.emp values(2,'b','30000'); 
insert into temp.emp values(3,'c','35000'); 
insert into temp.emp values(4,'d','40000'); 
insert into temp.emp values(5,'e','45000'); 
insert into temp.emp values(6,'f','20000'); 

select * from temp.emp 

SELECT 
    current.id, current.name, current.salary, 
    case 
     when current.id = 1 then current.salary 
     else 
      case 
       when current.salary > previous.salary then previous.salary 
       else current.salary 
      end 
    end 
FROM 
    temp.emp AS current 
    LEFT OUTER JOIN temp.emp AS previous 
    ON current.id = previous.id + 1 
+0

Вам нужно решение для сравнения предыдущей и следующей записей в одном запросе. Попробуйте выше .. –

Смежные вопросы