Mysql
 sql >> Datenbank >  >> RDS >> Mysql

LEFT JOIN verhält sich nicht wie erwartet, da NULLs in MySQL ausgegeben werden

Ich nehme an, der Grund dafür, dass es nicht so übereinstimmt, wie Sie es sich vorstellen, ist, dass @row_number wird nicht für jede Unterabfrage auf 1 zurückgesetzt.

Ich habe es getestet, indem ich einfach die ersten beiden (Professoren und Ärzte) verbunden habe, aber einen CROSS JOIN verwendet habe, damit ich alle row_number-Werte sehen konnte.

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

Sie können sehen, dass die Zeilennummern anscheinend progressiv erhöht werden und der Anfangswert von 1 in beiden Unterabfragen bereits vorhanden ist, wenn die Zeilen nummeriert werden.

Möglicherweise können Sie dies beheben, indem Sie in jeder Unterabfrage eine eigene Benutzervariable verwenden.

Aber diese Abfrage wird ohnehin nicht so funktionieren, wie Sie es sich wünschen, zum Beispiel wenn Sie jemals weniger Professoren als Angehörige anderer Berufe haben.

Ehrlich gesagt würde ich diese Art der Spaltenformatierung in SQL nicht durchführen. Führen Sie einfach vier unabhängige Abfragen durch, rufen Sie alle Ergebnisse in Ihre Anwendung ab und formatieren Sie sie bei der Ausgabe in Spalten. Auf diese Weise wird es viel einfacher, und einfacher Code ist leichter zu schreiben, leichter zu debuggen und leichter zu warten.

Zu Ihrem Kommentar:

Fair genug, dies als Programmierherausforderung zu tun, ist in Ordnung, solange Sie (und andere Leser) wissen, dass es in einem echten Projekt nicht immer die beste Idee ist, übermäßig cleveres SQL zu verwenden.

Da Sie eine Codierungsherausforderung durchführen, sollten Sie sie selbst lösen, daher kann ich Ihnen nicht die Lösung geben, die die folgende Ausgabe erzeugt. Aber dies ist ein Beweis dafür, dass es möglich ist (ich verspreche, dass ich die Ausgabe nicht verspottet habe, ich habe sie wirklich aus meinem Terminalfenster kopiert und eingefügt). Viel Glück!

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