Question

Je dois créer une vue qui ajoute automatiquement le numéro de ligne virtuelle dans le résultat. le graphique ici est totalement aléatoire tout ce que je veux atteindre est la dernière colonne à créer dynamiquement.

> +--------+------------+-----+
> | 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 |
> +--------+------------+-----+

Requête:

SELECT id, 
       variety, 
       SOMEFUNCTIONTHATWOULDGENERATETHIS() AS num 
  FROM mytable
Était-ce utile?

La solution

Utilisation:

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

Il est pas une façon idéale de le faire, parce que la requête de la valeur num exécutera pour chaque ligne retournée. Une meilleure idée serait de créer une table de NUMBERS, avec une seule colonne contenant un numéro commençant à qui incrémente à un nombre outrageusement grand, puis rejoindre et faire référence à la table NUMBERS de manière similaire à l'exemple variable qui suit.

Classement MySQL, ou l'absence

Vous pouvez définir une variable afin d'obtenir la fonctionnalité de psuedo numéro de ligne, parce que MySQL n'a pas de fonctions de classement:

SELECT t.id,
       t.variety,
       @rownum := @rownum + 1 AS num
  FROM TABLE t,
       (SELECT @rownum := 0) r
  • Le SELECT @rownum := 0 définit la variable, et il met à zéro.
  • Le r est un alias sous-requête / table, parce que vous aurez une erreur dans MySQL si vous ne définissez pas un alias pour une sous-requête, même si vous ne l'utilisez pas.

Impossible d'utiliser une variable dans une vue MySQL

Si vous le faites, vous obtenez l'erreur 1351, parce que est documenté ici .

Autres conseils

Oracle a une pseudo-colonne rowid. En MySQL, vous pourriez avoir à aller laid:

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

Cette requête est du haut de ma tête et non testé, donc le prendre avec un grain de sel. Il suppose également que vous voulez numéroter les lignes en fonction des critères de tri (id dans ce cas), plutôt que la numérotation arbitraire figurant dans la question.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top