SQL group by problem

时间:2010-11-30 20:47:19

标签: sql group-by nested-queries

我必须向数据库写一个查询,它有这样的表:

TABLE HISTORY:
ID | ITEM_ID | USER_ID | DATE

ITEM TABLE:
ID | NAME | OWNER_ID

历史记录表包含用户对项目的所有操作的记录。 我必须编写一个查询,它从HISTORY表中获取所有项目,这些项目不在所有者手中。因此,它应该采用每个项目的最后一个记录,并从中选择那些,而不是它的所有者的手。

我尝试使用嵌套查询编写它,但是如果我使用这样的子查询:

SELECT ITEM_ID, MAX(DATE) 
FROM HISTORY
GROUP BY ITEM_ID

我无法记录此记录的ID。所以,我不能遍历嵌套查询结果,因为我不知道他们的ID的ID。

你能帮帮我吗?

P.S。你可以告诉我未来,如何从group by子句的查询中获取列,而不是按语句分组?

1 个答案:

答案 0 :(得分:4)

我对这个问题的理解是,您希望所有最近历史记录条目由非所有者用户创建的项目。如果我错了,请纠正我。

select h.item_id
from item i
    inner join history h
        on h.item_id = i.id and i.owner_id != h.user_id
    inner join (select item_id, max(id), max(date) as date
                from history
                group by item_id) mh
        on mh.item_id = h.item_id and h.date = mh.date

上述查询假设日期时间在日期列中具有一定的唯一性保证。如果没有,你可以使用history.id,如果它是一个完全自动递增的标识列,你保证永远不会让任何人搞砸(好吧,也许不是那么严格,但你明白我的观点)。

在这种情况下:

select h.item_id
from item i
    inner join history h
        on h.item_id = i.id and i.owner_id != h.user_id
    inner join (select item_id, max(id) as id
                from history
                group by item_id) mh
        on mh.id = h.id