Проблемът може да е, че филтрирате в обединената таблица, като използвате условието 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
условие, ако искате да го запазите вместо това, трябва да използвате втория подход и предварително да филтрирате таблицата отдясно на лявото съединение.