Mysql
 sql >> Database >  >> RDS >> Mysql

LEFT JOIN non si comporta come previsto come fornisce NULL in MySQL

Suppongo che il motivo per cui non corrisponde al modo in cui pensi che dovrebbe essere che @row_number non viene reimpostato su 1 per ogni sottoquery.

L'ho provato, unendo solo i primi due (Professori e Dottori), ma usando un CROSS JOIN, così ho potuto vedere tutti i valori 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 |
+------------+--------+------------+----------+

Puoi vedere che apparentemente i numeri di riga vengono incrementati progressivamente e il valore iniziale di 1 in entrambe le sottoquery è già stato eseguito quando le righe vengono numerate.

Potresti essere in grado di risolvere questo problema utilizzando una variabile utente distinta in ogni sottoquery.

Ma questa query non funzionerà comunque nel modo desiderato, ad esempio se hai meno professori rispetto ai membri di altre professioni.

Onestamente, non farei questo tipo di formattazione colonnare in SQL. Basta eseguire quattro query indipendenti, recuperare tutti i risultati nell'applicazione e formattarli in colonne durante l'output. Sarà molto più semplice in questo modo e il codice semplice sarà più facile da scrivere, più facile da eseguire il debug, più facile da mantenere.

Re il tuo commento:

Abbastanza giusto, fare questo come una sfida di programmazione va bene, a patto che tu (e altri lettori) sappiate che in un progetto reale, fare un SQL eccessivamente intelligente non è sempre l'idea migliore.

Dato che stai facendo una sfida di codifica, dovresti risolverla da solo, quindi non posso darti la soluzione che produce l'output di seguito. Ma questa è la prova che è possibile (prometto di non aver simulato l'output, l'ho davvero copiato e incollato dalla finestra del mio terminale). Buona fortuna!

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