0

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

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。

你可以帮帮我吗?

PS你能告诉我未来,如何从带有group by子句的查询中获取那些不在group by语句中的列吗?

4

1 回答 1

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
于 2010-11-30T21:03:32.363 回答