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

LEFT JOIN не връща всички записи от лявата странична таблица

Проблемът може да е, че филтрирате в обединената таблица, като използвате условието where, което ще филтрира и услугите на отдела, които нямат съвпадение в присъединяването, преместете филтрирането в присъединяването и оставете само филтрите на d в клаузата where:

SELECT d.mt_code,
   d.dep_name,
   d.service_name,
   COUNT(t.id)
FROM DepartmentService AS d
LEFT JOIN tbl_outgoing AS t 
  ON d.mt_code = t.depCode 
    AND t.smsc = "mobitelMT"
    AND t.sendDate BETWEEN '2014-07-01' AND '2014-07-02'
WHERE d.service_type = 'MT'
GROUP BY d.mt_code

За да обясня защо се случва това, ще ви преведа какво се случва с вашата заявка и с моята заявка, като набор от данни ще използвам това:

states
 ____ _________ 
| id | state   |
|  1 | Germany |
|  2 | Italy   |
|  3 | Sweden  |
|____|_________|

cities

 ____ ________ ___________ ____________
| id | city   | state_fk  | population |
|  1 | Berlin |        1  |         10 |
|  2 | Milan  |        2  |          5 |
|____|________|___________|____________|

Първо ще прегледам вашата заявка.

SELECT s.id, s.state, c.population, c.city
FROM states s
LEFT JOIN cities c
ON c.state_fk = s.id
WHERE c.population < 10

Така че нека да вървим стъпка по стъпка, избирате трите щата, вляво се присъединявате с градове, завършващи с:

 ____ _________ ____________ ________
| id | state   | population | city   |
|  1 | Germany |         10 | Berlin |
|  2 | Italy   |          5 | Milan  |
|  3 | Sweden  |       NULL | NULL   |
|____|_________|____________|________|

Вие филтрирате съвкупността с помощта на WHERE c.population < 10 , в този момент отляво с това:

 ____ _________ ____________ ________
| id | state   | population | city   |
|  2 | Italy   |          5 | Milan  |
|____|_________|____________|________|

Вие загубихте Германия, защото населението на Берлин беше 10 но загубихте и Швеция който имаше NULL, ако искахте да запазите нулите, трябваше да го посочите в заявката:

WHERE (c.population < 10 OR IS NULL c.population)

Което връща:

 ____ _________ ____________ ________
| id | state   | population | city   |
|  2 | Italy   |          5 | Milan  |
|  3 | Sweden  |       NULL | NULL   |
|____|_________|____________|________|

Сега моето запитване:

SELECT s.id, s.state, c.population, c.city
FROM states s
LEFT JOIN cities c
ON c.state_fk = s.id
  AND c.population < 10

Преди да се присъединим към двете, филтрираме градовете в таблицата (използвайки AND c.population < 10 състояние след ON ), това, което остава е:

 ____ ________ ___________ ____________
| id | city   | state_fk  | population |
|  2 | Milan  |        2  |          5 |
|____|________|___________|____________|

Защото Милано е единственият град с население под 10 души,сега можем да обединим двете таблици:

 ____ _________ ____________ ________
| id | state   | population | city   |
|  1 | Germany |       NULL | NULL   |
|  2 | Italy   |          5 | Milan  |
|  3 | Sweden  |       NULL | NULL   |
|____|_________|____________|________|

Както можете да видите, данните от лявата таблица остават, тъй като условието за филтриране е приложено само към таблицата с градове.

Наборът от резултати се променя в зависимост от това, което искате да постигнете, ако например искате да филтрирате Германия, тъй като Берлин има население по-малко от 10 и да запазите Швеция, трябва да използвате първия подход, добавяйки IS 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. Запазване на сръбски латински знаци в базата данни

  2. Получаване на грешка „Класът PDO не е намерен“.

  3. Заявка, изпълнена два пъти (по грешка) в Java с нежелани стойности

  4. SQLSTATE[HY093] :израз на pdo по време на вмъкване в mysql db

  5. Въведение във Firebase