Como alguém pode incrementar um valor "fixo" na SELECT
cláusula de uma consulta, de modo que cada linha tenha um conjunto de valores diferente? Para um exemplo obviamente não funcional que ilustra a intenção:
SELECT
name, ++x as ordinal
FROM
foo;
name | ordinal
----------------
john | 0
paul | 1
george | 2
ringo | 3
A intenção final é selecionar usuários de um banco de dados para ganhar o primeiro, segundo e terceiro prêmios. Eu teria um usuário ganhando o primeiro prêmio, cinco vencedores do segundo prêmio e vinte vencedores do terceiro prêmio:
SELECT
name, IF(++x<2, 'first', IF(x<7, 'second', 'third') ) as prize
FROM
foo LIMIT 26;
name | prize
------------------
alice | first
bob | second
charlie | second
dotan | second
erik | second
frank | second
george | third
henry | third
: | :
: | :
Isso está sendo executado no MySQL v5.5. Obrigada.
Você pode usar variáveis definidas pelo usuário para isso.
No seu primeiro exemplo, isso seria tão simples quanto isto:
Aqui inicializamos a variável em outra consulta. Isso geralmente é mais confortável do que fazer isso:
quando você não tem permissão para executar várias instruções em PHP ou qualquer outra coisa.
As variáveis são vinculadas à sessão!
Além disso, inicializamos aqui com
-1
para que a primeira linha tenha value0
, porque@rn + 1
é avaliada primeiro.Observe também que adicionei uma
ORDER BY
cláusula. Se você não adicioná-lo, seu resultado não terá sentido, porque não há ordem em um banco de dados relacional, a menos que você o especifique. E os cálculos feitos com quaisquer variáveis naSELECT
cláusula dependem da ordem das linhas.Em relação ao seu segundo exemplo, aqui é importante apenas cuidar da ordem na
SELECT
cláusula.