Mysql
 sql >> Baza danych >  >> RDS >> Mysql

LEFT JOIN nie zachowuje się zgodnie z oczekiwaniami, ponieważ daje NULL w MySQL

Przypuszczam, że powodem, dla którego nie pasuje tak, jak uważasz, że powinien, jest to, że @row_number nie resetuje się do 1 dla każdego podzapytania.

Przetestowałem to, po prostu dołączając do pierwszych dwóch (profesorów i lekarzy), ale używając CROSS JOIN, więc mogłem zobaczyć wszystkie wartości 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 |
+------------+--------+------------+----------+

Widać, że najwyraźniej numery wierszy są zwiększane progresywnie, a początkowa wartość 1 w obu podzapytaniach została już wykonana do czasu numerowania wierszy.

Możesz to naprawić, używając odrębnej zmiennej użytkownika w każdym podzapytaniu.

Ale to zapytanie i tak nie zadziała tak, jak chcesz, na przykład, jeśli masz mniej profesorów niż członków innych profesji.

Szczerze mówiąc, nie zrobiłbym tego rodzaju formatowania kolumnowego w SQL. Po prostu wykonaj cztery niezależne zapytania, pobierz wszystkie wyniki do swojej aplikacji i sformatuj je w kolumny podczas wyprowadzania. W ten sposób będzie to znacznie prostsze, a prosty kod będzie łatwiejszy do napisania, łatwiejszy do debugowania i łatwiejszy w utrzymaniu.

Odpowiedz na swój komentarz:

W porządku, zrobienie tego jako wyzwanie kodowania jest w porządku, o ile Ty (i inni czytelnicy) wiesz, że w prawdziwym projekcie wykonanie nadmiernie sprytnego SQL nie zawsze jest najlepszym pomysłem.

Ponieważ zajmujesz się kodowaniem, powinieneś sam je rozwiązać, więc nie mogę podać rozwiązania, które da wynik poniżej. Ale to dowód na to, że jest to możliwe (obiecuję, że nie wymyśliłem danych wyjściowych, naprawdę skopiowałem i wkleiłem je z okna mojego terminala). Powodzenia!

+------------+-----------+--------+-----------+----------+
| 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Porównanie dat przy użyciu Hibernate Criteria API

  2. php wstawiając tablicę preg_match_all

  3. Laravel SQLSTATE[HY000] [1049] Nieznana baza danych 'previous_db_name'

  4. jak policzyć dopasowane słowa kluczowe za pomocą select w mysql codeigniter php?

  5. Jak wykryć, że transakcja została już rozpoczęta?