sql >> データベース >  >> RDS >> Mysql

一致するレコードがない場合にNULLを含む2つの列のすべての組み合わせを取得するMySqlクエリ

    最初の外部参加 、予想どおり、次のように生成されます:

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

    ただし、外部結合は、結合条件が少なくとも1回満たされた場合に結果を生成するため、 (そしてNULLのみを導入します 条件が決してであるかどうかを記録します 満足)、2番目の外部参加 その後、しません (B, July)のレコードを作成します; Reason = 'D'も削除します 完全に、参加条件が満たされていないため(そして、他の場所では3か月すべてが満たされているため):

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

    できた Reason = 'D'の損失を解決します 追加 OR a.Month IS NULL 参加条件に対して、(B, July)は生成されません。 。代わりに、(Reason, Month)のすべてのペアを取得する必要があるためです。 、CROSS JOIN あなたの具体化されたReasons マテリアライズされたMonthsを含むテーブル テーブル:

    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 |
    

    sqlfiddle でご覧ください 。

    次に、結果を基になるデータと外部結合するだけで済みます。

    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) |
    

    sqlfiddle でご覧ください 。




    1. MySQL LEFT JOIN MAX()値に応じて1行のみ

    2. '(アポストロフィ)や(引用符)などの特殊文字を含むMysql + php

    3. JSON配列内のJSONオブジェクトのPostgreSQLセットフィールド

    4. DancerとPostgresを使用したシンプルなログイン/認証システム