SQLite выбирает следующую и предыдущую строки на основе предложения where - PullRequest
4 голосов
/ 02 февраля 2010

Я хочу иметь возможность get следующей и предыдущей строки с использованием SQLite.

id  statusid  date
168 1   2010-01-28 16:42:27.167
164 1   2010-01-28 08:52:07.207
163 1   2010-01-28 08:51:20.813
161 1   2010-01-28 07:10:35.373
160 1   2010-01-27 16:09:32.550
 46 2   2010-01-30 17:13:45.750
145 2   2010-01-30 17:13:42.607
142 2   2010-01-30 16:11:58.020
140 2   2010-01-30 15:45:00.543

Например:

Учитывая id 46 Я хотел бы вернуть идентификаторы 160 (предыдущий) и 145 (следующий)

Учитывая id 160 Я хотел бы вернуть идентификаторы 161 (предыдущий) и 46 (следующий) и т.д ...

Помните , что данные упорядочены по statusId then dateCreated DESC и HAS для работы с использованием SQLite.

select * from @t order by statusId, dateCreated desc

Тестовые данные, созданные на сервере sql ...

set nocount on; set dateformat ymd;
declare @t table(id int, statusId int, dateCreated datetime)
insert into @t
select 168,1,'2010-01-28 16:42:27.167' union
select 164,1,'2010-01-28 08:52:07.207' union
select 163,1,'2010-01-28 08:51:20.813' union
select 161,1,'2010-01-28 07:10:35.373' union
select 160,1,'2010-01-27 16:09:32.550' union
select  46,2,'2010-01-30 17:13:45.750' union
select 145,2,'2010-01-30 17:13:42.607' union
select 142,2,'2010-01-30 16:11:58.020' union
select 140,2,'2010-01-30 15:45:00.543'

При использовании SQL Server 2005+ это будет довольно тривиально!

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

Вот тот же сценарий с тестовыми данными, но для SQLite , на котором сосредоточен вопрос.

create table t (id int, statusId int, dateCreated datetime);
insert into t
select 168,1,'2010-01-28 16:42:27.167' union
select 164,1,'2010-01-28 08:52:07.207' union
select 163,1,'2010-01-28 08:51:20.813' union
select 161,1,'2010-01-28 07:10:35.373' union
select 160,1,'2010-01-27 16:09:32.550' union
select  46,2,'2010-01-30 17:13:45.750' union
select 145,2,'2010-01-30 17:13:42.607' union
select 142,2,'2010-01-30 16:11:58.020' union
select 140,2,'2010-01-30 15:45:00.543';

РЕДАКТИРОВАТЬ 2 Обратите внимание, что данные не являютсяхороший пример, поэтому я должен изменить id 146 на 46

Ответы [ 2 ]

3 голосов
/ 02 февраля 2010

Эта проблема намного сложнее, чем кажется на первый взгляд. Два порядка по полям должны обрабатываться отдельно, а затем объединяться с объединением и получать соответствующий результат. Чтобы получить как предыдущий, так и следующий, нам нужен еще один союз, поэтому мы получим союз с подразделами.

Это работает с предоставленными данными. Я проверил много входов и получил правильные предыдущие / следующие выводы. При использовании убедитесь, что вы получаете ВСЕ экземпляры 146 для замены.

SELECT *
FROM
(
    SELECT  t1.*
    FROM    t t1,
            (
                SELECT  *
                FROM    t
                WHERE   id = 146
            ) t2
    WHERE   t1.statusid = t2.statusid
      AND   t1.dateCreated >= t2.dateCreated
      AND   t1.id <> 146

    UNION

    SELECT  t1.*
    FROM    t t1,
            (
                SELECT  *
                FROM    t
                WHERE   id = 146
            ) t2
    WHERE   t1.statusid < t2.statusid


    ORDER BY             
            t1.statusid DESC,
            t1.dateCreated 

    LIMIT 1
)

UNION

SELECT *
FROM 
(
    SELECT  t1.*
    FROM    t t1,
            (
                SELECT  *
                FROM    t
                WHERE   id = 146
            ) t2
    WHERE   t1.statusid = t2.statusid
      AND   t1.dateCreated <= t2.dateCreated
      AND   t1.id <> 146

    UNION

    SELECT  t1.*
    FROM    t t1,
            (
                SELECT  *
                FROM    t
                WHERE   id = 146
            ) t2
    WHERE   t1.statusid > t2.statusid


    ORDER BY             
            t1.statusid,
            t1.dateCreated DESC

    LIMIT 1
)

ORDER BY             
        statusid,
        dateCreated DESC
;
0 голосов
/ 02 февраля 2010
select id from theTable where id>@id order by id desc limit 1
union
select id from theTable where id<@id order by id desc limit 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...