2017-03-10 55 views
0

我有一個名爲表:工人和一個名爲表:以下格式時間表:mysql的兩個返回的最小值

工人:

| id | name  | vacationA | vacationB | workhistory | 
| 1 | Florin | 2017-05-05 | 2017-05-25 | 2010-01-01 | 
| 2 | Andrei | 2017-06-05 | 2017-06-25 | 2010-01-01 | 
| 3 | Alexandra | 2017-07-05 | 2017-07-25 | 2010-01-01 | 
| 4 | Emilia | 2017-08-05 | 2017-08-25 | 2010-01-01 | 
| 5 | Nicoleta | 2017-09-05 | 2017-09-25 | 2010-01-01 | 
+----+-----------+------------+------------+-------------+ 

時間表:

| day | month | name  | shifts | 
+-----+-------+-----------+--------+ 
| 1 |  6 | Florin |  0 | 
| 1 |  6 | Andrei |  1 | 
| 1 |  6 | Alexandra |  2 | 
| 1 |  6 | Emilia |  3 | 
| 1 |  6 | Nicoleta |  4 | 
+-----+-------+-----------+--------+ 

我需要詢問桌上的「工作人員」給我2個隨機姓名,最少輪班人數,工人不應處於休假期。工作經歷也必須超過18個月。 在這種情況下,我需要的查詢應該返回Florin和Andrei。

這是我這麼遠,但認爲它不工作:

SELECT name FROM workers WHERE (CURDATE() NOT BETWEEN vacationA AND vacationB) AND workhistory > (DATE_SUB(CURDATE(), INTERVAL 18 MONTH)) AND name IN (SELECT name FROM schedule ORDER BY shifts LIMIT 2) ORDER BY RAND() LIMIT 2; 

該查詢返回 1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

謝謝!

回答

1

因爲您已經有name專欄schedule表已經(儘管這不是一個好設計),您不需要join。您可以使用ORDER BYLIMIT,例如.e.g。

SELECT name 
FROM schedule 
WHERE day ? AND month = ? --Remove this if there is no crriteria 
ORDER BY shifts 
LIMIT 2; 
+0

謝謝您的回答。我已經更新了這個問題,如果你能幫忙的話。 – Kellog

0

答案很明顯,就是通過移動次數排序表和搶前兩個條目:

SELECT name FROM schedule ORDER BY shifts ASC LIMIT 2 

我注意到了,但是,你已經有一個ORDER BY條款,所以它似乎你想要隨機排列的結果。

如果您需要隨機的順序爲好,然後包裹整個事情在這樣的子查詢:

SELECT name FROM (SELECT name FROM schedule ORDER BY shifts ASC LIMIT 2) ORDER BY RAND() 
+0

謝謝你的回答。我已經更新了這個問題,如果你能幫忙的話。 – Kellog