Mysql
 sql >> Base de données >  >> RDS >> Mysql

LEFT JOIN ne se comporte pas comme prévu car donne des valeurs NULL dans MySQL

Je suppose que la raison pour laquelle il ne correspond pas comme vous le pensez est que @row_number ne se réinitialise pas à 1 pour chaque sous-requête.

Je l'ai testé, en rejoignant simplement les deux premiers (professeurs et docteurs), mais en utilisant un CROSS JOIN, afin que je puisse voir toutes les valeurs row_number.

+------------+--------+------------+----------+
| row_number | name   | row_number | name     |
+------------+--------+------------+----------+
|          8 | Aamina |          1 | Ashley   |
|          8 | Aamina |          2 | Belvet   |
|          8 | Aamina |          3 | Britney  |
|          8 | Aamina |          4 | Maria    |
|          8 | Aamina |          5 | Meera    |
|          8 | Aamina |          6 | Naomi    |
|          8 | Aamina |          7 | Priyanka |
|          9 | Julia  |          1 | Ashley   |
|          9 | Julia  |          2 | Belvet   |
|          9 | Julia  |          3 | Britney  |
|          9 | Julia  |          4 | Maria    |
|          9 | Julia  |          5 | Meera    |
|          9 | Julia  |          6 | Naomi    |
|          9 | Julia  |          7 | Priyanka |
|         10 | Priya  |          1 | Ashley   |
|         10 | Priya  |          2 | Belvet   |
|         10 | Priya  |          3 | Britney  |
|         10 | Priya  |          4 | Maria    |
|         10 | Priya  |          5 | Meera    |
|         10 | Priya  |          6 | Naomi    |
|         10 | Priya  |          7 | Priyanka |
+------------+--------+------------+----------+

Vous pouvez voir qu'apparemment, les numéros de ligne sont incrémentés progressivement et que la valeur initiale de 1 dans les deux sous-requêtes a déjà été effectuée au moment où les lignes sont numérotées.

Vous pourrez peut-être résoudre ce problème en utilisant une variable utilisateur distincte dans chaque sous-requête.

Mais cette requête ne fonctionnera de toute façon pas comme vous le souhaitez, par exemple si vous avez moins de professeurs que de membres d'autres professions.

Honnêtement, je ne ferais pas ce genre de formatage en colonnes en SQL. Effectuez simplement quatre requêtes indépendantes, récupérez tous les résultats dans votre application et formatez-les en colonnes au fur et à mesure de la sortie. Ce sera beaucoup plus simple de cette façon, et un code simple est plus facile à écrire, plus facile à déboguer, plus facile à entretenir.

Concernant votre commentaire :

Assez juste, faire cela comme un défi de codage est bien, tant que vous (et d'autres lecteurs) savez que dans un vrai projet, faire du SQL excessivement intelligent n'est pas toujours la meilleure idée.

Puisque vous faites un défi de codage, vous devez le résoudre vous-même, donc je ne peux pas vous donner la solution qui produit la sortie ci-dessous. Mais c'est la preuve que c'est possible (je promets que je n'ai pas simulé la sortie, je l'ai vraiment copiée et collée depuis la fenêtre de mon terminal). Bonne chance !

+------------+-----------+--------+-----------+----------+
| row_number | Professor | Doctor | Singer    | Actor    |
+------------+-----------+--------+-----------+----------+
|          1 | Ashley    | Aamina | Christeen | Eve      |
|          2 | Belvet    | Julia  | Jane      | Jennifer |
|          3 | Britney   | Priya  | Jenny     | Ketty    |
|          4 | Maria     | NULL   | Kristeen  | Samantha |
|          5 | Meera     | NULL   | NULL      | NULL     |
|          6 | Naomi     | NULL   | NULL      | NULL     |
|          7 | Priyanka  | NULL   | NULL      | NULL     |
+------------+-----------+--------+-----------+----------+