[英]Selecting top result from SQL
我認為這是一個簡單的問題,但我似乎無法解決。
我想從一個表中選擇最新的結果,並將其與另一個表中的單個元素結合在一起。
更好地說,這是一個簡單的架構:
Table 1 - Person
personId -PK - INT - AUTO ID
name - VARCHAR
Table 2 - Event
eventId - PK - INT - AUTO ID
personId - FK
timestamp - DATETIME
event - ENUM ('Went Out', 'Came back')
我想做的是返回所有人列表以及每個人執行的最新操作
結果示例:
名稱| personId | 時間戳| eventId | 事件
鮑勃 1 | 2011-08-7 3 | '出去'
我做了一個簡單的查詢,將兩個表連接在一起,然后按personId和按時間戳順序進行了分組,但是返回的結果始終是該人的第一個操作,而不是他們的最新操作。
有任何想法嗎?
SELECT p.name, p.personId, e.timestamp, e.eventId, e.event
FROM person p
INNER JOIN Event e
ON e.eventId =
( SELECT MAX(eventId)
FROM Event
WHERE personId = p.personId
GROUP BY personId
LIMIT 1 )
要么
SELECT p.Name, p.ID, me.timestamp, me.ID, me.event
FROM person p
INNER JOIN (
SELECT id, timestamp, event
FROM Event
WHERE personId = p.ID
ORDER BY timestamp DESC LIMIT 1
) me
ON p.ID = me.id
PS:對不起,但現在無法測試兩個查詢
SELECT
t1.Name,
t1.PersonId,
t2.TimeStamp,
t2.EventId,
t2.Event
FROM Table1 t1
INNER JOIN Table2 t2 ON t2.PersonId = t1.PersonID
INNER JOIN (SELECT
PersonId,
MAX(TimeStamp) as LastEventDateTime
FROM Table2
GROUP BY PersonID) LE
ON LE.PersonID = t2.PersonID
AND LE.LastEventDateTime = t2.TimeStamp
你想做一個
ORDER by `timestamp` DESC
(從降序開始遞減)以獲取最高的時間戳記值,而不是最低的
ANSI標准方式為:
select name, personid, timestamp, eventid, event
from person
join event on event.personid=person.personid
and event.timestamp=(select max(timestamp) from event e2
where e2.personid=person.personid)
我已經有一段時間沒有使用MySQL了,也沒有安裝方便的工具,但是您可能會得到想要的東西:
select name, personid, timestamp, eventid, event
from person
join event on event.personid=person.personid
group by personid
order by personid, timestamp desc
這是非標准的,因為按照標准,選擇中的所有內容都必須在分組依據中或為集合,在這里我們都不希望這樣做。 但是,正如我記得MySQL並不需要那樣,所以我會旋轉一下,看看會發生什么。
一種使用覆蓋鍵的替代解決方案,假定order by Id
將產生與order by timestamp
相同的結果
SELECT p.Name, p.ID, me.timestamp, me.ID, me.event
FROM person p
JOIN (
SELECT personId, MAX(ID) id
FROM Event
WHERE personId = p.ID
GROUP BY personId
) me
ON p.ID = me.id
Order by timestamp
更自然,也可能更安全,但這更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.