Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

LEFT JOIN không trả về tất cả các bản ghi từ bảng bên trái

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.




  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 - Tính tổng của nhiều bảng đã kết hợp

  2. truyền tham số trong thủ tục lưu trữ truy vấn chèn trong laravel 4

  3. Có thể bắt giá trị không hợp lệ trong MySQL khi tôi gặp lỗi ràng buộc khóa ngoại không?

  4. Webscrape súp đẹp thành mysql

  5. Nối các bảng từ hai cơ sở dữ liệu bằng codeigniter