首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找出SQL中一组项目的最后一项

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

Stack Overflow用户
提问于 2011-11-26 13:37:03
回答 3查看 95关注 0票数 2

想象一个这样的MySql表:

代码语言:javascript
复制
---------------------------
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查询来获取下一项:

代码语言:javascript
复制
SELECT * FROM items_tbl
WHERE listID = "$listId"
AND itemID = "$itemID"
LIMIT 1

在SQL中有没有一种简单的方法来判断我得到的项目是否是列表中的最后一项?

我可以向表中添加一列并标记每个列表的最后一项,或者我可以进行另一个查询,获取最高的项号并与我的列表中的当前项进行比较,或者获取列表中项的总数并跟踪与列表总数相关的项数……但所有这些解决方案看起来都像是一个黑客。

有没有人能用SQL推荐一些更好的东西,并解释一下它是如何工作的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-26 15:18:42

您没有说明您的数据库管理系统,但下面是一个符合ANSI (应该适用于PosgreSQL、Oracle、DB2)

代码语言:javascript
复制
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()):

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-11-26 14:08:17

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

代码语言:javascript
复制
SELECT id, ListID, itemID, item, (SELECT MAX(id) FROM table_name) as max_id from table_name;

这将返回表中的所有列以及名为max_id且具有最大id的附加列,因此您可以在应用程序中检查max_id == id,如果是,则它是最后一列

票数 1
EN

Stack Overflow用户

发布于 2011-11-26 13:45:54

最简单的事情可能是,在开始之前,获取每个列表中最高的id:

代码语言:javascript
复制
Select listID, max(itemID) from mytable group by listID
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8276553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档