2016-06-13 93 views
4

我想加入兩個表,即職員和工作人員考試時間表。員工可以參加N次考試。我的結果應該是工作人員編號,工作人員姓名,上次完成的考試的結束時間。SQL查詢與不工作的訂單

我的表結構如下

職員表

staff_id staff_full_name  staff_status 

    500  Sakthi   active 

    550  Siraj   active 

    600  Shihab K H  active 

    620  John David  active 

    670  Javed Akthar  active 

examtime表

examtime_id examtime_staffid examtime_endtime 

    100  500   2014-10-10 

    101  600   2016-05-01 

    102  670   2016-06-10 

    103  670   2014-04-01 

    104  670   2016-06-13 

    105  670   2016-06-11 

結果集的SQL查詢低於

SELECT S.staff_id, S.staff_full_name, ET.examtime_endtime 
FROM staffs S LEFT JOIN examtime ET ON ET.examtime_staffid = S.staff_id 
WHERE 1 AND S.staff_status = 'active' GROUP BY S.staff_full_name ORDER BY S.staff_full_name ASC , ET.examtime_endtime DESC 

但我GE設置結果集如下。無論考試結束時間如何,它都會獲取考試時間表的第一條記錄。見下面結果集(Javed Akthar最新的考試日期是2016-06-13,但它取材於2016-06-10)。

500 Sakthi  2014-10-10 

600 Shihab KH 2016-05-01 

670 Javed Akthar 2016-06-10 
+2

你'集團BY'造成問題,「閱讀我的想法「實際上它[不這樣做](https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html):」... MySQL擴展到標準SQL ...在這種情況下,服務器可以自由選擇每個組中的任何值,因此除非它們相同,所選擇的值是不確定的,這可能不是你想要的。「 –

回答

2

問題是與你的GROUP BY條款,你沒有指定要爲每一個該日期,所以它是隨機選擇的,而不是necessarly中最大的一個。

You can find a good explanation about this behaviour here in @mjv answer

嘗試此查詢:

SELECT S.staff_id, S.staff_full_name, max(ET.examtime_endtime) as max_endTime 
FROM staffs S 
LEFT JOIN examtime ET 
ON (ET.examtime_staffid = S.staff_id) 
WHERE S.staff_status = 'active' 
GROUP BY S.staff_id , 
     S.staff_full_name 
ORDER BY S.staff_full_name ASC , 
     max_endTime DESC 

它會選擇每個staff_id最大日期和將它訂購。一般來說 - 通常在GROUP BY子句中指定代表每個組的所有列(在本例中爲staff_id,staff_full_name),並使用聚合函數(AVG/MAX/MIN ..)指定所有其他列,這將有助於避免此類問題未來。

1

如果您只想爲每位員工提供最近的考試時間,並且不需要該表中的任何其他列,則可以使用標準SQL執行此操作,並避免使用MySQL "extension"(其中包含您可以不在聚集和不在GROUP BY和MySQL該列選擇任意值)列:因爲你想它的意思

SELECT MIN(S.staff_id) as staff_id, 
     S.staff_full_name, 
     MAX(ET.examtime_endtime) as examtime_endtime 
FROM staffs S LEFT JOIN examtime ET ON ET.examtime_staffid = S.staff_id 
WHERE S.staff_status = 'active' 
GROUP BY S.staff_full_name 
+0

實際上,'staff_id'是唯一的,不需要'MIN()'。 – sagi

+0

@sagi - 作爲標準,它必須位於GROUP BY或合計中。既然我們知道它是獨一無二的,它*不關心我們使用哪一個。我更願意儘量減少「GROUP」鍵的大小,您更喜歡消除「不必要」的聚合。哪種方法是正確的可以取決於許多因素,並且(因爲上面使用的是標準SQL)所涉及的權衡可能在不同的平臺/版本上有所不同。 –