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

右テーブルmysqlからの空の行との左結合

    これは、今日無料のすべてのレストランの今月のすべてのリストです:

    SELECT  r.`id`, r.`name`, o.`date`, o.`status`,  o.`id` order_id
    FROM    restaurants r
            INNER JOIN orders o 
                ON r.id = o.restaurant_id
            LEFT JOIN
            (   SELECT  DISTINCT o2.Restaurant_ID
                FROM    orders o2
                WHERE   o2.date = DATE(CURRENT_TIMESTAMP)
            ) o2
                ON r.id = o2.restaurant_id
    WHERE   o.Date >= DATE_FORMAT(CURRENT_TIMESTAMP ,'%Y-%m-01')
    AND     o.Date <= DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01')
    AND     o2.Restaurant_ID IS NULL;
    

    これにより、今日予約されているすべてのレストランが取得され(サブクエリo2)、これらのレストランが除外されます:

    AND     o2.Restaurant_ID IS NULL;
    

    これは、今月少なくとも1日が空いているすべてのレストランの今月のすべてのリストです:

    SELECT  r.`id`, r.`name`, o.`date`, o.`status`,  o.`id` order_id
    FROM    restaurants r
            INNER JOIN orders o 
                ON r.id = o.restaurant_id
                AND o.date BETWEEN '2013-08-10' AND '2013-08-31' 
            INNER JOIN
            (   SELECT  o2.Restaurant_ID
                FROM    orders o2
                WHERE   o2.Date >= DATE_FORMAT(CURRENT_TIMESTAMP ,'%Y-%m-01')
                AND     o2.Date <= DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01')
                GROUP BY o2.Restaurant_ID
                HAVING COUNT(DISTINCT o2.Date) < DAY(DATE_ADD(DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01'), INTERVAL -1 DAY))
            ) o2
                ON r.id = o2.restaurant_id
    WHERE   o.Date >= DATE_FORMAT(CURRENT_TIMESTAMP ,'%Y-%m-01')
    AND     o.Date <= DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01');
    

    秘訣は、今月の日数を取得することです。

    DAY(DATE_ADD(DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01'), INTERVAL -1 DAY))
    

    次に、結果をこれより予約が少ないrestaurant_idに制限します:

    HAVING COUNT(DISTINCT o2.Date) < DAY(DATE_ADD(DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01'), INTERVAL -1 DAY))
    

    SQLFiddleでの両方の例




    1. MySQLで逆合成主キーを許可しない

    2. MySQLは、チェック時にインデックスを使用しません=1ですが、=0で使用します

    3. ランサムウェアキャンペーンからMySQLデータベースを保護する方法

    4. MySQLで日時に挿入する場合のPHPのdate()形式