[英]MySql Query with INNER JOIN, GROUP BY and Max
我有兩個表,一個看起來像這樣:
ID, Datetime, User_ID, Location and Status // the rest is not relevant
另一個看起來像這樣:
ID, Lastname // the rest is not relevant
現在,我只想獲取每個User_ID
Datetime
最高的第一個表的條目,並詢問另一個表User_ID
的lastname
。 簡單...
我以這種方式嘗試過(whi似乎是最有前途的,但仍然是錯誤的):
SELECT w.Datetime, w.User_ID, w.Status, e.Lastname
FROM worktimes AS w
INNER JOIN employees AS e
ON w.User_ID=e.ID
RIGHT JOIN (SELECT max(Datetime) AS Datetime, User_ID
FROM worktimes
WHERE Datetime>1467583200 AND Location='16'
GROUP BY User_ID
ORDER BY Datetime DESC
) AS v
ON v.User_ID=w.User_ID
GROUP BY w.User_ID
ORDER BY e.Nachname;
有人可以給我一個提示嗎? 我真的被這個問題困擾了一段時間,現在我的腦子里開始有些打結……:(
您非常接近,實際上:
SELECT w.Datetime, w.User_ID, w.Status, e.Lastname
FROM worktimes w INNER JOIN
employees e
ON w.User_ID = e.ID LEFT JOIN
(SELECT max(Datetime) AS Datetime, User_ID
FROM worktimes
WHERE Datetime > 1467583200 AND Location = '16'
GROUP BY User_ID
) ww
ON ww.User_ID = w.User_ID AND w.DateTime = ww.DateTime
ORDER BY e.Nachname;
筆記:
DateTime
值。 RIGHT JOIN
是不必要的。 我用LEFT JOIN
代替了它,但是我不確定那不是您想要的。 您可以從INNER JOIN
開始,看看是否產生所需的內容。 ORDER BY
。 GROUP BY
您要問的是相關子查詢 。 在標准SQL中,可以使用APPLY
和LATERAL
構造來實現。 不幸的是,並非所有的RDBMS都支持這些優雅的解決方案。 例如, MSSQL , Oracle和Postgresql的最新版本具有這些構造,而MySQL沒有。 恕我直言,這對MySQL用戶是一個真正的痛苦,因為近年來MySQL開始傾向於標准,但是以某種奇怪的方式-默認情況下,它關閉了非標准的hacks,但是沒有實現標准的hack。 例如,默認情況下,問題中出現的您自己的查詢在默認情況下將無法使用,因為不再支持在子查詢中進行排序,並且要使其正常工作,您必須使用一些討厭的技巧-在子查詢中添加LIMIT some_really_big_number
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.