簡體   English   中英

具有INNER JOIN,GROUP BY和Max的MySQL查詢

[英]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_IDlastname 簡單...

我以這種方式嘗試過(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中,可以使用APPLYLATERAL構造來實現。 不幸的是,並非所有的RDBMS都支持這些優雅的解決方案。 例如, MSSQLOraclePostgresql的最新版本具有這些構造,而MySQL沒有。 恕我直言,這對MySQL用戶是一個真正的痛苦,因為近年來MySQL開始傾向於標准,但是以某種奇怪的方式-默認情況下,它關閉了非標准的hacks,但是沒有實現標准的hack。 例如,默認情況下,問題中出現的您自己的查詢在默認情況下將無法使用,因為不再支持在子查詢中進行排序,並且要使其正常工作,您必須使用一些討厭的技巧-在子查詢中添加LIMIT some_really_big_number

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM