Выяснить последний элемент группы элементов в SQL - PullRequest
2 голосов
/ 26 ноября 2011

Представьте себе таблицу MySql, подобную этой:

---------------------------
ListID | itemID | Item
---------------------------
List_1 | item_1 | Apple
---------------------------
List_1 | item_2 | Orange
---------------------------
List_1 | item_3 | Pear
---------------------------
List_2 | item_1 | Potatoes
---------------------------
List_2 | item_2 | ...

У меня есть функция getNextItem(), которая увеличивает ItemID и использует SQL-запрос для получения следующего элемента:

SELECT * FROM items_tbl
WHERE listID = "$listId"
AND itemID = "$itemID"
LIMIT 1

Есть ли в SQL простой способ выяснить, является ли получаемый предмет последним в этом списке?

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

Может кто-нибудь предложить что-то лучшее в SQL и немного объяснить, как он работает?

Ответы [ 3 ]

1 голос
/ 26 ноября 2011

Я бы добавил автоинкрементный первичный ключ с именем id в вашу таблицу и использовал бы вложенный SQL-запрос для получения максимального идентификатора таблицы.

SELECT id, ListID, itemID, item, (SELECT MAX(id) FROM table_name) as max_id from table_name;

это вернет все столбцы вашей таблицы с одним дополнительным столбцом с именемmax_id с максимальным идентификатором, так что вы можете проверить в приложении max_id == id, если это так, то это последний столбец

0 голосов
/ 26 ноября 2011

Вы не указали свою СУБД, но ниже приведен ANSI-совместимый SQL (должен работать на PosgreSQL, Oracle, DB2)

SELECT *
FROM (
    SELECT listid, 
           itemid,
           case 
              when lead(itemid) over (partition by listid order by itemid) is null then 'last'
              else 'not_last'
           end as last_flag
    FROM items_tbl
    WHERE listID = 'List_1'
) t
WHERE itemID = 'item_2'

Редактировать , следующее должно работать наSQL Server (поскольку он еще не поддерживает lead()):

SELECT listid, 
       itemid,
       case 
         when rn = list_count the 'last'
         else 'not_last'
       end
FROM (
    SELECT listid, 
           itemid,
           row_number() over (partition by listid order by itemid) as rn,
           count(*) over (partition by listid) as list_count
    FROM items_tbl
    WHERE listID = 'List_1'
) t
WHERE itemID = 'item_2'
0 голосов
/ 26 ноября 2011

Самое простое, что вы могли бы сделать, это, прежде чем начать, получить самый высокий идентификатор в каждом списке:

Select listID, max(itemID) from mytable group by listID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...