Предположим, у меня есть следующая таблица MySQL (InnoDB):
+-------------------------------------------------------------------+
| table "taskList" |
+----+------------------+----------+---------------------+----------+
| ID | TaskName | Category | Date_time | Priority |
+----+------------------+----------+---------------------+----------+
| 1 | cleanup | system | 2019-06-02 03:30:00 | 5 |
+----+------------------+----------+---------------------+----------+
| 2 | create_user | system | 2019-03-23 11:56:10 | 5 |
+----+------------------+----------+---------------------+----------+
| 3 | send_invoice | system | 2019-03-23 11:56:17 | 6 |
+----+------------------+----------+---------------------+----------+
| 4 | perform_selftest | system | 2019-06-25 06:54:11 | 1 |
+----+------------------+----------+---------------------+----------+
| 5 | add_destination | map | 2019-02-15 16:21:04 | 2 |
+----+------------------+----------+---------------------+----------+
| 6 | verify_VIN | chassis | 2019-01-04 09:35:49 | 5 |
+----+------------------+----------+---------------------+----------+
Я хочу написать запрос, выбирая любые записи, которые соответствуют всем следующим условиям (обратите внимание, что значения между кавычками являются примерами и будут параметризованы в реальном мире):
- Категория 'system'
- Date_time между '2019-01-01' и '2019-07-01'
- , имеющими самый высокий Приоритет в этом подмножестве, ближайший к '2' (сам 2 разрешен, но не более высокий, как1)
В этом случае имеется 4 записи, соответствующие первым двум условиям. Но из этих 4 только 2 соответствуют условию для Приоритета. Поэтому здесь должны быть возвращены записи № 1 и № 2 (и только те). Просматривая этот сайт, я написал следующий запрос, который, кажется, работает, но он довольно уродлив, и у меня есть ощущение, что он может быть более эффективным с точки зрения производительности:
SELECT * FROM taskList
WHERE category='system'
AND (Date_time BETWEEN '2019-01-01' AND '2019-07-01')
AND Priority=(
SELECT MIN(Priority) FROM taskList
WHERE category='system'
AND (Date_time BETWEEN '2019-01-01' AND '2019-07-01')
AND Priority >= 2
)
ORDER BY Date_time DESC
Кто-нибудь знает олучший способ сделать это?