SQL Select Statement отключен одной переменной, но не может найти проблему

0

Я тестирую, как использовать переменную 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;

Изображение 174551

  • 0
    HAVING без GROUP BY недействителен. Это даже не имеет смысла.
  • 0
    @ Эрик причина, по которой я использую HAVING, в том, что я действительно хочу сказать «ГДЕ ранг = 1», но это не работает, потому что Где нельзя ссылаться на псевдонимы, такие как ранг
Показать ещё 1 комментарий
Теги:

1 ответ

0
Лучший ответ

Вам не хватает действительно важного момента: таблицы 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 чтобы получить строки, отличные от первого.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню