我必须向数据库写一个查询,它有这样的表:
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子句的查询中获取列,而不是按语句分组?
答案 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