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

Truy vấn MySql để nhận tất cả các kết hợp của hai cột với NULL nếu không có bản ghi phù hợp

Tham gia bên ngoài đầu tiên của bạn , như mong đợi, tạo ra:

| REASON |  MONTH |
-------------------
|      A |    May |
|      A |    May |
|      A |   July |
|      A |   June |
|      B |    May |
|      B |   June |
|      D | (null) |

Tuy nhiên, vì các phép nối bên ngoài tạo ra kết quả nếu điều kiện nối được thỏa mãn ít nhất một lần (và chỉ giới thiệu NULL ghi lại nếu điều kiện là không bao giờ hài lòng), tham gia bên ngoài thứ hai của bạn thì không tạo bản ghi cho (B, July); nó cũng giảm Reason = 'D' hoàn toàn, bởi vì điều kiện tham gia không được đáp ứng (và cả ba tháng đã được thỏa mãn ở nơi khác):

| REASON | MONTH |
------------------
|      A |   May |
|      A |   May |
|      B |   May |
|      A |  June |
|      B |  June |
|      A |  July |

Trong khi bạn có thể giải quyết việc mất Reason = 'D' bằng cách thêm OR a.Month IS NULL với điều kiện tham gia của bạn, bạn vẫn sẽ không tạo ra (B, July) . Thay vào đó, vì bạn muốn có được mọi cặp (Reason, Month) , bạn phải CROSS JOIN Reasons cụ thể hóa của bạn bảng với Months được hiện thực hóa của bạn bảng:

SELECT Reason, Month
FROM   
  (
    SELECT 'A' AS Reason
    UNION ALL SELECT 'B'
    UNION ALL SELECT 'D'
  ) Reasons CROSS JOIN (
    SELECT 'May' AS Month
    UNION ALL SELECT 'June'
    UNION ALL SELECT 'July'
  ) Months
| REASON | MONTH |
------------------
|      A |   May |
|      B |   May |
|      D |   May |
|      A |  June |
|      B |  June |
|      D |  June |
|      A |  July |
|      B |  July |
|      D |  July |

Xem nó trên sqlfiddle .

Sau đó, bạn chỉ cần kết hợp bên ngoài kết quả với dữ liệu cơ bản của bạn:

SELECT Reason, Month, SUM(Down_time) downtime
FROM   
  (
    SELECT 'A' AS Reason
    UNION ALL SELECT 'B'
    UNION ALL SELECT 'D'
  ) Reasons CROSS JOIN (
    SELECT 'May' AS Month
    UNION ALL SELECT 'June'
    UNION ALL SELECT 'July'
  ) Months
  LEFT JOIN tabledown USING (Reason, Month)
GROUP BY Reason, Month
| REASON | MONTH | DOWNTIME |
-----------------------------
|      A |  July |        3 |
|      A |  June |        8 |
|      A |   May |        7 |
|      B |  July |   (null) |
|      B |  June |        6 |
|      B |   May |        5 |
|      D |  July |   (null) |
|      D |  June |   (null) |
|      D |   May |   (null) |

Xem nó trên sqlfiddle .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bảng mới cho mọi người dùng?

  2. CHAR () Ví dụ trong MySQL

  3. Cơ sở dữ liệu MySQL của tôi bị hỏng ... Tôi phải làm gì bây giờ?

  4. Nhiều biểu mẫu và một bộ thu PHP

  5. Xếp hạng top-N của MySQL và tổng hợp phần còn lại của cùng một nhóm