2011-01-27 16 views
7

मेरे पास दो टेबल हैं जिन्हें मैं शामिल करने का प्रयास कर रहा हूं। एक में ग्राहकों की एक सूची होती है, दूसरा ऑर्डर की एक सूची है। मैं एक प्रश्न तैयार करने की कोशिश कर रहा हूं जो मुझे तालिका ग्राहकों में सूचीबद्ध सभी ग्राहकों का चयन करने की अनुमति देगा जिनके पास तालिका ऑर्डर में कम से कम एक ऑर्डर है। हालांकि, मैं उन ग्राहकों के लिए डुप्लीकेट नहीं प्राप्त करना चाहता हूं जिनके पास एकाधिक ऑर्डर हैं। कोई सुझाव मैं इसे कैसे पूरा कर सकता हूं?MySQL - डुप्लीकेट के बिना दो टेबल में शामिल हो?

मुझे पता है कि यह शायद एक आम मुद्दा है, हालांकि मुझे नहीं पता कि इस प्रकार की क्वेरी को क्या कहा जाएगा ताकि मैं एक उत्तर खोज सकूं। किसी भी सुझाव के लिए बहुत आभार होगा। धन्यवाद।

+0

क्या आपने ** DISTINCT ** के साथ प्रयास किया था? – FeRtoll

उत्तर

10

यह बहुत सरल से आपको लगता है सकते हैं:

select distinct(customer_id) from orders;

संपादित करें: आप वास्तव में ग्राहक पर पूर्ण जानकारी प्राप्त करना चाहते हैं,

select * from customers where customer_id in (select distinct(customer_id) from orders);

+0

धन्यवाद, ऐसा लगता है कि यह सफलता का सबसे अच्छा मौका देगा। चूंकि ग्राहक और ऑर्डर टेबल इतने बड़े हैं (ग्राहकों में 180 मिलियन रिकॉर्ड, ऑर्डर में 70 मिलियन) अलग-अलग, खासकर ग्राहकों पर, समस्याग्रस्त है। – Wige

+1

मुझे नहीं लगता कि सबक्वायरी में अलग-अलग आवश्यक है - इसमें कोई अंतर नहीं है या नहीं, इसके बिना एक्सप्लाइन प्लान को जांचें। –

+0

सहमत हुए। मैं दिमागी रूप से पहली क्वेरी से प्रतिलिपि/चिपकाया। –

1
select customers.id, customers.name, count(orders.id) 
from customers 
    inner join orders on orders.customer_id = customers.Id 
group by customers.id, customers.name 
having count(orders.id) > 0 
+0

यदि आप लौट रहे हैं तो ग्राहक_आईडी और ऑर्डर की संख्या है, इसमें शामिल होने की कोई आवश्यकता नहीं है। 'ग्राहक_आईडी का चयन करें, ग्राहक_आईडी द्वारा ऑर्डर समूह से गिनती (*) चाल चलती है। –

+0

@ माइकल: मैंने पहले ही इसे बदल दिया है? –

+0

ओह, ध्यान नहीं दिया। –

0
SELECT 
    c.id, 
    c.name 
FROM 
    customer c 
    INNER JOIN order o ON o.customer_id = c.id 
GROUP BY 
    c.id, 
    c.name 
HAVING 
    COUNT(o.id) >= 1 

याद नहीं रख सकता है अगर हैविंग या ग्रुप बाय पहले आता है।

5

उपयोग:

SELECT c.* 
    FROM CUSTOMERS c 
WHERE EXISTS (SELECT NULL 
       FROM ORDERS o 
       WHERE o.custeromid = c.id) 

में खंड एक विकल्प है, लेकिन मौजूद डुप्लिकेट के लिए बेहतर काम करता है क्योंकि यह पहली डुप्लिकेट पर सही रिटर्न तो यह पूरे मेज पर कार्रवाई नहीं करता है।

+0

क्या यह 'o.customerid' पर कोई अनुक्रमणिका होने पर न केवल बेहतर प्रदर्शन करेगा? –

+0

@ क्लोस बिस्कोव हॉफमैन: आपको परीक्षण करना और देखना होगा, लेकिन पहले मैच पर बाहर निकलने से सभी की तुलना में मेरे लिए बेहतर लगता है। डेटा प्रकार भी उसमें एक भूमिका निभा सकता है। –

+0

हाँ, मैं मानता हूं कि पहले मैच से बाहर निकलना शायद लगभग हमेशा बेहतर होता है। मैं बस सबसे खराब मामले के बारे में सोच रहा था और केवल सैद्धांतिक हित से बाहर पूछ रहा था :-) –

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