Интересно, почему я должен назначить переменной сеанса в mysql?

#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;