Masalahnya bisa jadi Anda memfilter pada tabel gabungan menggunakan kondisi where yang akan memfilter juga layanan departemen yang tidak memiliki kecocokan di gabungan, memindahkan pemfilteran di gabungan dan hanya menyisakan filter di d
dalam klausa 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
Untuk menjelaskan mengapa ini terjadi, saya akan memandu Anda melalui apa yang terjadi dengan kueri Anda dan kueri saya, sebagai kumpulan data, saya akan menggunakan ini:
states
____ _________
| id | state |
| 1 | Germany |
| 2 | Italy |
| 3 | Sweden |
|____|_________|
cities
____ ________ ___________ ____________
| id | city | state_fk | population |
| 1 | Berlin | 1 | 10 |
| 2 | Milan | 2 | 5 |
|____|________|___________|____________|
Pertama, saya akan membahas pertanyaan Anda.
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
Jadi mari kita melangkah selangkah demi selangkah, Anda memilih tiga negara bagian, kiri bergabung dengan kota-kota yang diakhiri dengan:
____ _________ ____________ ________
| id | state | population | city |
| 1 | Germany | 10 | Berlin |
| 2 | Italy | 5 | Milan |
| 3 | Sweden | NULL | NULL |
|____|_________|____________|________|
Anda memfilter populasi menggunakan WHERE c.population < 10
, pada titik ini Anda pergi dengan ini:
____ _________ ____________ ________
| id | state | population | city |
| 2 | Italy | 5 | Milan |
|____|_________|____________|________|
Anda kehilangan Jerman karena populasi Berlin adalah 10 tetapi Anda juga kehilangan Swedia yang memiliki NULL, jika Anda ingin mempertahankan nol, Anda harus menentukannya dalam kueri:
WHERE (c.population < 10 OR IS NULL c.population)
Yang mengembalikan:
____ _________ ____________ ________
| id | state | population | city |
| 2 | Italy | 5 | Milan |
| 3 | Sweden | NULL | NULL |
|____|_________|____________|________|
Sekarang pertanyaan saya:
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
Sebelum menggabungkan keduanya, kami memfilter tabel kota (menggunakan AND c.population < 10
kondisi setelah ON
), yang tersisa adalah:
____ ________ ___________ ____________
| id | city | state_fk | population |
| 2 | Milan | 2 | 5 |
|____|________|___________|____________|
Karena Milan adalah satu-satunya kota dengan populasi di bawah 10, sekarang kita dapat menggabungkan dua tabel:
____ _________ ____________ ________
| id | state | population | city |
| 1 | Germany | NULL | NULL |
| 2 | Italy | 5 | Milan |
| 3 | Sweden | NULL | NULL |
|____|_________|____________|________|
Seperti yang Anda lihat, data dari tabel kiri tetap ada karena kondisi pemfilteran diterapkan hanya ke tabel kota.
Hasil yang ditetapkan berubah tergantung pada apa yang ingin Anda capai, jika misalnya Anda ingin memfilter Jerman karena Berlin memiliki populasi lebih kecil dari 10 dan mempertahankan Swedia, Anda harus menggunakan pendekatan pertama dengan menambahkan IS NULL
kondisi, jika Anda ingin menyimpannya, Anda harus menggunakan pendekatan kedua dan memfilter tabel di sebelah kanan gabungan kiri.