sql >> Databasteknik >  >> RDS >> Mysql

LEFT JOIN beter sig inte som förväntat som ger NULLs i MySQL

Jag antar att anledningen till att den inte stämmer överens som du tror att den borde är att @row_number återställs inte till 1 för varje underfråga.

Jag testade det, jag gick bara med i de två första (professorer och läkare), men använde en CROSS JOIN, så att jag kunde se alla radnummervärden.

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

Du kan se att radnumren uppenbarligen ökas progressivt, och det initiala värdet på 1 i båda underfrågorna har redan gjorts när raderna numreras.

Du kanske kan fixa detta genom att använda en distinkt användarvariabel i varje underfråga.

Men den här frågan kommer inte att fungera som du vill ändå, till exempel om du någonsin har färre professorer än medlemmar av andra yrken.

Ärligt talat skulle jag inte göra den här typen av kolumnformatering i SQL. Gör bara fyra oberoende frågor, hämta alla resultat till din applikation och formatera i kolumner när du matar ut. Det blir mycket enklare på det sättet, och enkel kod är lättare att skriva, lättare att felsöka, lättare att underhålla.

Angående din kommentar:

Det är rättvist att göra detta som en kodningsutmaning, så länge du (och andra läsare) vet att i ett verkligt projekt är det inte alltid den bästa idén att göra överdrivet smart SQL.

Eftersom du gör en kodningsutmaning bör du lösa den själv, så jag kan inte ge dig lösningen som producerar utdata nedan. Men detta är ett bevis på att det är möjligt (jag lovar att jag inte hånade resultatet, jag kopierade och klistrade in det från mitt terminalfönster). Lycka till!

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



  1. kan inte lagra returvärde från execute-satsen i mysql

  2. Vad är skillnaden mellan ifnull och coalesce i mysql?

  3. Hur man hanterar/använder specialtecken som procent (%) och et-tecken (&) i Oracle SQL-frågor

  4. Tio tips för att gå in i produktion med PostgreSQL