Ранг строки в представлении MySQL

Мне нужно создать представление, которое автоматически добавляет номер виртуальной строки в результат. график здесь абсолютно случайный, все, чего я хочу добиться, это последний столбец, который будет создан динамически.

> +--------+------------+-----+
> | id     | variety    | num |
> +--------+------------+-----+
> | 234    | fuji       |   1 |
> | 4356   | gala       |   2 |
> | 343245 | limbertwig |   3 |
> | 224    | bing       |   4 |
> | 4545   | chelan     |   5 |
> | 3455   | navel      |   6 |
> | 4534345| valencia   |   7 |
> | 3451   | bartlett   |   8 |
> | 3452   | bradford   |   9 |
> +--------+------------+-----+

Запрос:

SELECT id, 
       variety, 
       SOMEFUNCTIONTHATWOULDGENERATETHIS() AS num 
  FROM mytable

person Moak    schedule 27.12.2009    source источник
comment
Возможный дубликат ROW_NUMBER() в MySQL   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 25.05.2016


Ответы (2)


Использовать:

SELECT t.id,
       t.variety,
       (SELECT COUNT(*) FROM TABLE WHERE id < t.id) +1 AS NUM
  FROM TABLE t

Это не идеальный способ сделать это, потому что запрос значения num будет выполняться для каждой возвращаемой строки. Лучшей идеей было бы создать таблицу NUMBERS с одним столбцом, содержащим число, начинающееся с единицы, которое увеличивается до невероятно большого числа, а затем соединить и сослаться на таблицу NUMBERS способом, аналогичным следующему примеру переменной.

Рейтинг MySQL или его отсутствие

Вы можете определить переменную, чтобы получить функциональность псевдономера строки, потому что MySQL не имеет никаких функций ранжирования:

SELECT t.id,
       t.variety,
       @rownum := @rownum + 1 AS num
  FROM TABLE t,
       (SELECT @rownum := 0) r
  • SELECT @rownum := 0 определяет переменную и устанавливает ее в ноль.
  • r — это псевдоним подзапроса/таблицы, потому что вы получите ошибку в MySQL, если не определите псевдоним для подзапроса, даже если вы его не используете.

Невозможно использовать переменную в представлении MySQL

Если вы это сделаете, вы получите ошибку 1351, потому что вы нельзя использовать переменную в представлении из-за дизайна. поведение ошибки/функции описано здесь.

person OMG Ponies    schedule 27.12.2009
comment
хорошее решение, однако я не могу увидеть его в своем представлении: # 1351 - SELECT представления содержит переменную или параметр:/ - person Moak; 27.12.2009
comment
Вы, вероятно, можете определить переменную перед запуском запроса, поэтому нет необходимости в подзапросе. Я не уверен, что это конкретная переменная соединения/курсора или она глобальная, поэтому вам нужно сначала это выяснить. - person Tor Valamo; 27.12.2009
comment
@Tor: Если бы это была хранимая процедура, но ОП специально запрашивает это в представлении. - person OMG Ponies; 27.12.2009

Oracle имеет псевдостолбец rowid. В MySQL вам, возможно, придется пойти некрасиво:

SELECT id,
       variety,
       1 + (SELECT COUNT(*) FROM tbl WHERE t.id < id) as num
  FROM tbl

Этот запрос не приходит мне в голову и не проверен, так что отнеситесь к нему с недоверием. Кроме того, предполагается, что вы хотите пронумеровать строки в соответствии с некоторыми критериями сортировки (в данном случае id), а не произвольной нумерацией, показанной в вопросе.

person Marcelo Cantos    schedule 27.12.2009
comment
Я думаю, вы имеете в виду (SELECT COUNT(*) FROM tbl WHERE t.id < id) + 1 AS num - COUNT не принимает оператор SELECT в качестве параметра: dev.mysql.com/doc/refman/5.1/en/ - person OMG Ponies; 27.12.2009
comment
+1: проверена исправленная версия, результат соответствует ожидаемому. - person OMG Ponies; 27.12.2009