#mysql #sql
#mysql #sql
Вопрос:
Почему я должен присваивать переменной сеанса, чтобы она имела правильный номер в таком запросе:
SELECT @row_number := @row_number 1, name FROM cities;
Вместо чего-то вроде:
SELECT @row_number, name FROM cities;
Во второй форме он возвращает, как я предполагаю, номер последней строки. Может быть, даже значение a COUNT(*)
. Это почти так, как если бы значение каким-то образом закрывалось. Что происходит в этих двух запросах?
Комментарии:
1. нет необходимости присваивать переменной сеанса, какую переменную сеанса вы назначаете?
2. Если вы ей не присваиваете, она не будет добавлять 1 каждый раз.
3. @aRvi
@row_number
— это переменная сеанса.
Ответ №1:
у вас есть @row_number
переменная. Каждый раз, когда приведенный ниже sql попадает в запись, он показывает результат и увеличивается на единицу.
SELECT @row_number := @row_number 1, name FROM cities;
если вы используете mysql 8.0 , вы можете использовать row_number
функцию window для достижения того же результата
select row_number() over (order by <pk>) rn, name from cities;
Если мы вернемся к SELECT @row_number, name FROM cities;
, вы не icrementing @row_number
, который по очереди показывает всегда одно и то же значение, которому присваивается значение для @row_number
PS: пожалуйста, также обратите внимание, что вы не используете order by
предложение в своем запросе, что может привести к несогласованной нумерации строк.
Ответ №2:
Вам нужно присвоить ей, чтобы добавить 1 к значению в каждой строке. Если вы этого не сделаете, вы получите одно и то же значение в каждой строке, которое не является номером строки. Это будет то, что осталось с момента последнего назначения переменной, которое может быть общим количеством строк из предыдущего запроса, который был правильно увеличен.
Если вы используете MySQL 8.x, вы можете заменить это использование переменных сеанса ROW_NUMBER()
функцией.
Ответ №3:
Вместо переменной сеанса для MySQL версии 8 вы можете использовать ROW_NUMBER()
, а для MySQL ниже 8 вы можете сделать это
SELECT @row_number := @row_number 1, name
FROM cities,
(SELECT @row_number:= 0) AS x;