Vấn đề có thể là bạn đang lọc trên bảng đã kết hợp bằng cách sử dụng điều kiện where sẽ lọc cả các dịch vụ của bộ phận không khớp trong phần tham gia, hãy di chuyển bộ lọc trong phần kết hợp và chỉ để lại các bộ lọc trên d
trong mệnh đề 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
Để giải thích lý do tại sao điều này xảy ra, tôi sẽ hướng dẫn bạn những gì xảy ra với truy vấn của bạn và với truy vấn của tôi, dưới dạng tập dữ liệu, tôi sẽ sử dụng điều này:
states
____ _________
| id | state |
| 1 | Germany |
| 2 | Italy |
| 3 | Sweden |
|____|_________|
cities
____ ________ ___________ ____________
| id | city | state_fk | population |
| 1 | Berlin | 1 | 10 |
| 2 | Milan | 2 | 5 |
|____|________|___________|____________|
Trước tiên, tôi sẽ xem xét truy vấn của bạn.
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
Vì vậy, không phải đi từng bước, bạn chọn ba tiểu bang, kết hợp bên trái với các thành phố kết thúc bằng:
____ _________ ____________ ________
| id | state | population | city |
| 1 | Germany | 10 | Berlin |
| 2 | Italy | 5 | Milan |
| 3 | Sweden | NULL | NULL |
|____|_________|____________|________|
Bạn lọc dân số bằng WHERE c.population < 10
, tại thời điểm này, bạn còn lại với cái này:
____ _________ ____________ ________
| id | state | population | city |
| 2 | Italy | 5 | Milan |
|____|_________|____________|________|
Bạn mất nước Đức vì dân số Berlin là 10 nhưng bạn cũng thua Thụy Điển mà có NULL, nếu bạn muốn giữ các giá trị null, bạn nên chỉ định nó trong truy vấn:
WHERE (c.population < 10 OR IS NULL c.population)
Trả về:
____ _________ ____________ ________
| id | state | population | city |
| 2 | Italy | 5 | Milan |
| 3 | Sweden | NULL | NULL |
|____|_________|____________|________|
Bây giờ truy vấn của tôi:
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
Trước khi kết hợp cả hai, chúng tôi lọc các thành phố trong bảng (sử dụng AND c.population < 10
điều kiện sau ON
), những gì còn lại là:
____ ________ ___________ ____________
| id | city | state_fk | population |
| 2 | Milan | 2 | 5 |
|____|________|___________|____________|
Vì Milan là thành phố duy nhất có dân số dưới 10 tuổi, hiện tại chúng ta có thể nối hai bảng:
____ _________ ____________ ________
| id | state | population | city |
| 1 | Germany | NULL | NULL |
| 2 | Italy | 5 | Milan |
| 3 | Sweden | NULL | NULL |
|____|_________|____________|________|
Như bạn có thể thấy, dữ liệu từ bảng bên trái vẫn giữ nguyên vì điều kiện lọc được áp dụng chỉ vào bảng thành phố.
Tập hợp kết quả thay đổi tùy thuộc vào những gì bạn muốn đạt được, ví dụ:nếu bạn muốn lọc Đức vì Berlin có dân số dưới 10 tuổi và giữ Thụy Điển, bạn nên sử dụng phương pháp đầu tiên thêm IS NULL
điều kiện, nếu bạn muốn giữ nó thay vào đó, bạn nên sử dụng cách tiếp cận thứ hai và lọc trước bảng ở bên phải của phép nối bên trái.