Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

LEFT JOIN tidak mengembalikan semua record dari tabel sisi kiri

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL Perbarui beberapa baris pada satu kolom berdasarkan nilai dari kolom yang sama

  2. pengertian mysql jelaskan

  3. Batas waktu habis pgadmin Tidak dapat terhubung ke server

  4. Bagaimana cara mengelompokkan dan menghitung nilai unik dan menghitung beberapa nilai sebagai agregat pada kolom yang sama di python pandas?

  5. Tidak dapat menginstal mysqlclient