Я разрабатываю функцию назначения заказов и пытаюсь назначить заказ пользователю, у которого меньше всего ожидающих запросов. Я хочу получить идентификатор пользователя, где значение для ожидающего является наименьшим из всех пользователей.
Пример:
userID pending
------ -------
0 3
1 0 <----This user has the least pending of all
2 4
Как настроить запрос SQL для возврата идентификатора пользователя с наименьшим количеством ожидающих запросов таблицы?
$sql="SELECT user_id FROM writerdata_tb WHERE pending = '//Minimum pending here//' LIMIT 1";
$assign = $conn->query($sql);
$row = $assign->fetch_assoc();
Сравнение различных возможных ответов предлагается:
EXPLAIN SELECT aa.userId, aa.pending
FROM writerdata_tb AS aa
INNER JOIN writerdata_tb AS bb
ON aa.userId = bb.userId
WHERE aa.pending >= bb.pending
ORDER BY aa.pending ASC
LIMIT 1;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE aa ALL PRIMARY NULL NULL NULL 4 Using temporary; Using filesort
1 SIMPLE bb ALL PRIMARY NULL NULL NULL 4 Using where; Using join buffer (Block Nested Loop)
EXPLAIN SELECT userId, pending
FROM writerdata_tb
WHERE pending = (
SELECT MIN(pending)
FROM writerdata_tb
);
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY writerdata_tb ALL NULL NULL NULL NULL 4 Using where
2 SUBQUERY writerdata_tb ALL NULL NULL NULL NULL 4 NULL
EXPLAIN SELECT userId, pending
FROM writerdata_tb
ORDER BY pending ASC
LIMIT 1;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE writerdata_tb ALL NULL NULL NULL NULL 4 Using filesort
EXPLAIN SELECT t.userId
FROM writerdata_tb AS t
GROUP BY (
t.userId
)
ORDER BY SUM(pending) ASC
LIMIT 1;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t index PRIMARY PRIMARY 4 NULL 4 Using temporary; Using filesort
Вы можете заказать результаты по столбцу в ожидании (см. комментарий Симоне Нигро для запроса). С использованием предел словом, в результате вы получите только первый ряд, в этом случае вы получите результат с минимальным ожидающим значением.
Теперь я вижу случай с Александаром Миладиновичем, если в таблице много строк с одинаковым значением в ожидании: вы можете выполнить:
Используйте значение, полученное на предыдущем шаге, чтобы получить строки с этим значением
SELECT user_id FROM writerdata_tb WHERE pending = (SELECT min (в ожидании) FROM writerdata_tb)
Попробуйте следующим образом: выберите userID из writerdata_tb, где pending = (выберите min (pending) из writerdata_tb);
Если идентификаторы повторяются
SELECT
t.userID
from
tasks as t
group by (t.userID)
order by sum(pending) asc
limit 1
еще
SELECT
t.userID
from
tasks as t
order by pending asc
limit 1