2013-08-21 4 views
5

से स्थिति के साथ कम से कम एक पंक्ति के साथ शामिल हो गया है मेरे पास 2 टेबल, रेस्तरां और ऑर्डर हैं, ऑर्डर तालिका में restaurant_id, status और date फ़ील्ड हैं, प्रत्येक दिन आदेश तालिका में एक अलग पंक्ति है।दाएं mysql

मुझे रेस्तरां फ़िल्टर करने और केवल उन रेस्तरां को दिखाने की आवश्यकता है जिनके पास कुछ दिनांक सीमा के लिए कम से कम एक आरक्षण है, लेकिन मुझे इसे कैलेंडर पर दिखाना है, यह जानकारी वाले रेस्तरां की सूची जैसा दिखना चाहिए।

Smth इस

enter image description here

तो की तरह, यह मतलब है कि अगर at least one day with reserved status शर्त यह है कि समय अवधि के दौरान संतुष्ट है, कि रेस्तरां के लिए उस समय अवधि की सभी आदेशों के साथ ही दिलवाया जाना चाहिए।

मैं एक सामान्य भीतरी में शामिल नहीं कर सकते हैं,

SELECT r.`id`, r.`name`, o.`date`, o.`status` 
FROM restaurants r 
INNER JOIN orders o ON r.id = o.restaurant_id AND o.date BETWEEN '2013-08-10' AND '2013-08-31' 
AND status = 'reserved' 

, क्योंकि इस मामले में, उदाहरण के लिए, मैं 31 अगस्त आदेश की जानकारी, restaurant2 के लिए, नहीं होगा पुराना होने के कारण गुस्से में है, हालांकि 10 से 31 तक, लेकिन इसकी स्थिति 'बंद' है। तो, मैं एक छोड़ दिया इस

SELECT r.`id`, r.`name`, o.`date`, o.`status`, o.`id` order_id 
FROM restaurants r 
LEFT JOIN orders o ON r.id = o.restaurant_id AND 
o.date BETWEEN '2013-08-10' AND '2013-08-31' 
WHERE o.`id` IS NOT NULL 

की तरह शामिल हो बनाने के लिए सोच रहा हूँ लेकिन मैं यह भी सुनिश्चित करने के लिए वहाँ आदेश की स्थिति = 'आरक्षित' के साथ कम से कम एक पंक्ति है कि एक शर्त जोड़ने की जरूरत है, मैं जोड़ने के लिए है, जहां की कोशिश की COUNT(o.status = 1) > 0 जैसे खंड लेकिन यह एक त्रुटि देता है।

धन्यवाद

+1

एक सबक्वेरी का प्रयोग कम से कम एक रिकॉर्ड जहां स्थिति आरक्षित है तो y के साथ restauants पाने के लिए:। एक दूसरे ही रेस्तरां है कि अवधि के भीतर एक आरक्षण है कि तक सीमित करने में शामिल होने के कहां एक आंतरिक शामिल हो सकते हैं। –

+0

@DanBracuk क्या आप इसके बारे में थोड़ा विस्तार कर सकते हैं? धन्यवाद – dav

उत्तर

3

मुझे लगता है कि सबसे अच्छा तरीका है इस लक्ष्य को हासिल करने के लिए ('एन/ए' और 'आरक्षित' आदेश तालिका पहले उदाहरण में सभी आदेशों को शामिल होने के लिए है में जमा हो जाती तरह बातें सोचते हैं, और उसके बाद का उपयोग

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 DISTINCT o2.Restaurant_ID 
      FROM orders o2 
      WHERE o2.date BETWEEN '2013-08-10' AND '2013-08-31' 
      AND  o2.Status = 'Reserved' 
     ) o2 
      ON r.id = o2.restaurant_id; 

Example on SQL Fiddle

+0

आपको पता नहीं है कि मैं आपके लिए कितना आभारी हूं :)। बहुत बहुत धन्यवाद। और lemme एक बात पूछो - क्या यह बहुत महंगा होगा अगर मेरे पास सैकड़ों हजार रेस्तरां हैं? और मुझे इसे अनुकूलित करने के लिए क्या सूचकांक की आवश्यकता होगी? – dav

+0

हां, यह शायद सबसे अधिक स्केलेबल समाधान है। मुझे नहीं पता कि आप टेबल पर अन्य प्रश्नों का उपयोग कैसे कर सकते हैं, लेकिन इसके लिए मेरे पास 'restaurant_id',' status' और 'date' पर 'ऑर्डर' पर 3 इंडेक्स होंगे, या आपके वितरण के आधार पर यह बेहतर हो सकता है केवल 2 इंडेक्स हैं, उनमें से एक कॉलम में से एक है, डेटा के वितरण को जानने के बिना बिल्कुल कहना मुश्किल है। जैसे यदि प्रत्येक 'ऑर्डर' प्रति दिन प्रति रेस्तरां अद्वितीय है, तो मैं इन दो कॉलम पर एक अनन्य इंडेक्स जोड़ूंगा, जिसमें स्थिति पर एक गैर-क्लस्टर इंडेक्स होगा। – GarethD

+0

धन्यवाद आपकी मदद के लिए आप वास्तव में बहुत अधिक हैं। मैं एक और बात पूछना चाहता था। मैंने एक ही प्रश्न का उपयोग करने की कोशिश की लेकिन नि: शुल्क पुनर्विक्रेताओं को प्राप्त करने के लिए बाएं शामिल होने (एंटी-जॉइन) के साथ, लेकिन मैं इसे समझ नहीं पाया, अगर आप इसके साथ मेरी मदद कर सकते हैं, तो यह बहुत अच्छा होगा - मैंने एक नया प्रश्न पोस्ट किया इसके लिए http://stackoverflow.com/questions/18362311/left- जॉइन-with-empty-rows-from-right-table-mysql। धन्यवाद – dav

संबंधित मुद्दे