我有一个名为:workers 的表和一个名为:schedule 的表,其格式如下:
worker :
| 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 |
+-----+-------+-----------+--------+
我需要询问表“ worker ”,给我 2 个随机姓名,最少轮类数,并且 worker 不应该处于休假期间。此外,工作经历必须超过 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 - 此版本的 MySQL 尚不支持“LIMIT & IN/ALL/ANY/SOME 子查询”
。
谢谢!
最佳答案
由于您已经在 schedule
表中获得了 name
列(尽管这不是一个好的设计),因此您不需要 join
。您可以将 ORDER BY
与 LIMIT
一起使用,例如
SELECT name
FROM schedule
WHERE day ? AND month = ? --Remove this if there is no crriteria
ORDER BY shifts
LIMIT 2;
关于mysql返回两个最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42722138/