2016-07-04 61 views
0

我有兩個表,一個看起來像這樣:MySQL查詢與INNER JOIN,GROUP BY和最大

ID, Datetime, User_ID, Location and Status // the rest is not relevant 

和其他看起來像這樣:

ID, Lastname // the rest is not relevant 

現在我只想獲得第一個表的每User_ID最高Datetime的條目,並要求其他表User_IDlastname。簡單...

我嘗試了這種方式(whick看起來最有前途的,但是是假的nontheless):

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; 

可能有人給我一個提示嗎?我真的被困在此有一段時間了,現在我開始得到一些結在我的大腦... :(

+0

怎麼樣,如果你創建了一些數據有點sqlfiddle。以表格的形式顯示您的期望。有人把它敲出來。 – Drew

+0

今天提示:從右連接切換到左連接! (人們通常有足夠的問題,左連接,右連接是這樣較爲混亂......它很容易想到主表左連接可選的數據,不是可選的數據右連接主​​表。) – jarlh

+0

看,這些人是聰明的多,更有文化。 – Drew

回答

2

你非常接近,實際上是:

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在外部查詢
+0

我需要一個右連接,因爲左邊的表太大而無法使用左連接。但是有了正確的加入,它似乎能正常工作......我會再測試一下,但是非常感謝。你是一個很好的幫助。 –

1

你問什麼被稱爲correlated subqueries。在標準SQL中,可以使用APPLYLATERAL構造來實現。不幸的是,並不是所有的RDBMS都支持這些優雅的解決方案。例如,MSSQL,近期OraclePostgresql版本有這些結構,但MySQL的沒有。恕我直言,這對MySQL用戶來說是一個真正的痛苦,因爲最近幾年MySQL開始傾向於標準化,但以一種奇怪的方式 - 默認情況下,它會關閉其非標準的黑客,但不會實現標準的對應方式。例如,您自己的查詢你的問題不會在默認情況下在最近版本的MySQL的工作中提出,因爲在子查詢排序不支持任何更多,並使其工作,你必須使用一些討厭的黑客 - 添加LIMIT some_really_big_number到子查詢。

+0

順便說一句,排序可能無法在子查詢中工作的原因是因爲在理論上,排序表不是一個「集合」,而是一個「光標」。如果我錯了,我希望有些聰明的專家會糾正我。 – Jacobian