Я тестирую, как использовать переменную count, чтобы столбец моего вывода SELECT был предназначен для простого перечисления номера строки. Так что, если бы у меня было 3 строки, выведенных в запрос, тогда они были бы пронумерованы {1,2,3} в своем столбце "rank", как я написал...
Кроме того, я хочу выбрать только одну строку, где столбец "rank" этого столбца равен 1. Следующий оператор SQL работает (удостоверяясь, что я SET @rownum = 0 каждый раз), однако он не дает мне соответствующего вывода. Итак, ища rank = 1, я получаю строку, где ранг фактически равен 2. Если я ищу rank = 2, тогда я получаю там, где это действительно 3. и так далее. Если я тогда ищу ранга = 0, я НЕ получаю, где ранг равен 1 Удивительно. Так что я потерялся
SET @rownum=0;
SELECT @rownum := @rownum + 1 AS rank,
r.id, c.fname, r.pickupCity, r.pickupState
FROM request r
INNER JOIN client c ON r.client = c.id
INNER JOIN pickup p ON r.id = p.request
INNER JOIN driver d ON d.id = p.driver
WHERE date = '2018-04-18' AND d.id = 1
HAVING rank = 1;
Вам не хватает действительно важного момента: таблицы SQL представляют собой неупорядоченные множества. Вы не должны ожидать соответствия между идентификаторами и номерами строк без order by
. Период. И это еще более заметно в запросах, которые используют объединения.
Я бы предложил использовать order by
в подзапросе, например:
SELECT x.*, @rownum := @rownum + 1 AS rank
FROM (SELECT r.id, c.fname, r.pickupCity, r.pickupState
FROM request r JOIN
client c
ON r.client = c.id
pickup p
ON r.id = p.request
driver d
ON d.id = p.driver
WHERE date = '2018-04-18' AND d.id = 1
ORDER BY r.id
) x CROSS JOIN
(SELECT @rownum := 0) params
HAVING rank = 1;
Тем не менее, другой способ написать запрос будет использовать limit
и offset
:
SELECT r.id, c.fname, r.pickupCity, r.pickupState
FROM request r JOIN
client c
ON r.client = c.id
pickup p
ON r.id = p.request
driver d
ON d.id = p.driver
WHERE date = '2018-04-18' AND d.id = 1
ORDER BY r.id
LIMIT 1 OFFSET 0;
Вы можете изменить значение OFFSET
чтобы получить строки, отличные от первого.
HAVING
безGROUP BY
недействителен. Это даже не имеет смысла.