Mysql
 sql >> база данни >  >> RDS >> Mysql

LEFT JOIN не се държи според очакванията, тъй като дава NULL в MySQL

Предполагам, че причината да не съвпада по начина, по който смятате, че трябва е, че @row_number не се нулира на 1 за всяка подзаявка.

Тествах го, като просто съединих първите двама (професори и доктори), но използвах CROSS JOIN, за да мога да видя всички стойности на 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 |
+------------+--------+------------+----------+

Можете да видите, че очевидно номерата на редовете се увеличават прогресивно и първоначалната стойност от 1 в двете подзаявки вече е направена до момента, в който редовете са номерирани.

Може да успеете да поправите това, като използвате отделна потребителска променлива във всяка подзаявка.

Но тази заявка така или иначе няма да работи както искате, например ако някога имате по-малко професори, отколкото представители на други професии.

Честно казано, не бих направил този вид колонно форматиране в SQL. Просто направете четири независими заявки, изтеглете всички резултати във вашето приложение и форматирайте в колони, докато извеждате. По този начин ще бъде много по-просто и простият код е по-лесен за писане, по-лесен за отстраняване на грешки, по-лесен за поддръжка.

Re your comment:

Честно казано, правенето на това като предизвикателство за програмиране е добре, стига вие (и другите читатели) да знаете, че в реален проект, правенето на прекалено умен SQL не винаги е най-добрата идея.

Тъй като правите предизвикателство за кодиране, трябва да го разрешите сами, така че не мога да ви дам решението, което произвежда резултата по-долу. Но това е доказателство, че е възможно (обещавам, че не съм макирал изхода, наистина го копирам и поставям от моя терминален прозорец). Успех!

+------------+-----------+--------+-----------+----------+
| 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. Как да изберете редове с най-новия час за всяка дата в рамките на последните 30 дни от сега

  2. Php - MySQL избира данни от таблица, след което актуализира същата таблица

  3. Данните с отворен код нарастват:Избор на MySQL, NoSQL или и двете

  4. Наистина ли трябва да направя mysql_close()

  5. Грешка при недефинирано отместване на php при импортиране на CSV