Вопрос

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

> +--------+------------+-----+
> | 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
Это было полезно?

Решение

Использование:

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

Это не идеальный способ сделать это, потому что запрос на числовое значение будет выполняться для каждой возвращаемой строки.Лучшей идеей было бы создать 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, потому что вы не можете использовать переменную в представлении из-за дизайнаповедение ошибки / функции задокументировано здесь.

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top