Mysql
 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;

इस महीने के सभी रेस्तरां के लिए यह सभी लिस्टिंग है, जिनके पास इस महीने कम से कम एक निःशुल्क दिन है:

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

फिर परिणाम को उन रेस्तरां_आईडी तक सीमित करें जिनकी इससे कम बुकिंग है:

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

SQL Fiddle पर दोनों का उदाहरण




  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 एनम बनाम सेट

  2. MySQL से केवल विशिष्ट तालिकाओं को कैसे डंप करें?

  3. हाइबरनेट बैच इंसर्ट कैसे काम करता है?

  4. MySQL में डेटाटाइम कॉलम से दिनांक कैसे प्राप्त करें

  5. mysql में प्रत्येक व्यक्ति के लिए दूसरा उच्चतम वेतन प्राप्त करें