找出SQL中一组项目的最后一项

时间:2011-11-26 05:37:03

标签: mysql sql

想象一下像这样的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 个答案:

答案 0 :(得分:1)

我会在表中添加一个名为id的自动增量主键,并使用嵌套的SQL查询来获取表的最大id

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

这将返回表的所有列,其中一个名为max_id的列具有最大ID,因此您可以在应用中检查max_id == id,如果是,则是最后一列

答案 1 :(得分:0)

最容易做的事情可能是,在开始之前,获取每个列表中的最高ID:

Select listID, max(itemID) from mytable group by listID

答案 2 :(得分:0)

您没有说明您的DBMS,但以下是符合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'