2012-10-15 19 views
45

SELECT name, price, photo FROM drinks, drinks_photos WHERE drinks.id = drinks_id* एकाधिक तालिकाओं से चुनें। MySQL

5 पंक्तियों (5 सरणियों) yeilds, photo एक पंक्ति में केवल अद्वितीय क्षेत्र है। name, price दोहराएं (यहां,fanta-name, price3 बार दोहराएं।) मैं इन डुप्लिकेट से कैसे छुटकारा पा सकता हूं?

संपादित करें: मुझे प्रत्येक पेय के लिए name, price और सभी photo चाहिए।

id  name  price 
    1. fanta  5 
    2.  dew   4 


id  photo     drinks_id 
    1.  ./images/fanta-1.jpg  1 
    2.  ./images/fanta-2.jpg  1 
    3.  ./images/fanta-3.jpg  1 
    4.  ./images/dew-1.jpg  2 
    5.  ./images/dew-2.jpg  2 
+4

ठीक है आपके पास 5 मिलान पंक्तियां हैं, क्योंकि आपके पास एक ही पेय के साथ कई पंक्तियां हैं। आप * क्या होने की उम्मीद करेंगे? आप किस तस्वीर को रखने की उम्मीद करेंगे? –

उत्तर

66

क्या आप यहाँ कर एक JOIN (हालांकि आप इसे परोक्ष करते हैं, क्योंकि आप एक से अधिक तालिकाओं से चुनें) कहा जाता है। इसका मतलब है, अगर आपने अपने WHERE खंड में कोई शर्त नहीं डाली है, तो आपके पास उन तालिकाओं के सभी संयोजन थे। केवल आपकी हालत के साथ आप उन पंक्तियों में शामिल होने तक सीमित हैं जहां पेय आईडी मेल खाता है।

लेकिन इस पेय के साथ एक्स फोटो हैं, तो प्रत्येक पेय के परिणामस्वरूप एक्स एकाधिक पंक्तियां अभी भी हैं। आपका कथन को प्रतिबंधित नहीं करता है जो तस्वीर जो आप चाहते हैं!

यदि आप केवल एक पंक्ति प्रति पेय चाहते हैं, तो आपको एसक्यूएल को बताना होगा कि यदि आप एक विशेष पेय के साथ कई पंक्तियां हैं तो आप क्या करना चाहते हैं। इसके लिए आपको समूह और aggregate function की आवश्यकता है। आप एसक्यूएल को बताते हैं कि आप कौन सी प्रविष्टियां एक साथ समूह करना चाहते हैं (उदाहरण के लिए सभी बराबर पेय_आईड्स) और चयन में, आपको यह बताना होगा कि प्रत्येक समूहीकृत परिणाम पंक्ति के लिए कौन सी अलग-अलग प्रविष्टियां लेनी चाहिए। संख्याओं के लिए, यह औसत, न्यूनतम, अधिकतम (कुछ नाम देने के लिए) हो सकता है।

आपके मामले में, यदि आप केवल एक पंक्ति चाहते हैं तो मुझे पेय के लिए फ़ोटो पूछने की भावना दिखाई नहीं दे रही है। आपने शायद सोचा था कि प्रत्येक पेय के लिए आपके परिणाम में फोटो की सरणी हो सकती है, लेकिन एसक्यूएल ऐसा नहीं कर सकता है।

SELECT name, price, photo 
FROM drinks, drinks_photos 
WHERE drinks.id = drinks_id 
GROUP BY drinks_id 

name  price photo 
fanta 5  ./images/fanta-1.jpg 
dew  4  ./images/dew-1.jpg 
: यदि आप केवल किसी भी तस्वीर चाहते हैं और आप परवाह नहीं है जो आप drinks_id से मिल जाएगा, बस समूह है (क्रम में पेय प्रति केवल एक पंक्ति पाने के लिए)

MySQL में, हम भी GROUP_CONCAT है, तो आप चाहते हैं, तो फ़ाइल नाम एक ही स्ट्रिंग के लिए श्रेणीबद्ध किया जाना है:

SELECT name, price, GROUP_CONCAT(photo, ',') 
FROM drinks, drinks_photos 
WHERE drinks.id = drinks_id 
GROUP BY drinks_id 

name  price photo 
fanta 5  ./images/fanta-1.jpg,./images/fanta-2.jpg,./images/fanta-3.jpg 
dew  4  ./images/dew-1.jpg,./images/dew-2.jpg 

हालांकि, यदि आपके पास , फ़ील्ड मानों के भीतर है तो यह खतरनाक हो सकता है, क्योंकि अधिकतर आप क्लाइंट पक्ष पर इसे फिर से विभाजित करना चाहते हैं। यह एक मानक एसक्यूएल समग्र समारोह भी नहीं है।

+0

हाँ मैं प्रत्येक पेय के लिए नाम, मूल्य और छवियों की एक सरणी चाहता था। – NestedWeb

+1

छवियों का ऐरे ... क्या आप वास्तव में जानते हैं कि एक रिलेटिनल डेटाबेस क्या है? –

+2

आप किस भाषा में अपने प्रोग्राम को उन प्रश्नों को कोड करते हैं? चूंकि MySQL फ़ील्ड प्रकारों के रूप में सरणी का समर्थन नहीं करता है। आपको 'GROUP_CONCAT' के साथ कुछ स्ट्रिंग ट्रिक्स करना होगा और इसे दोबारा विभाजित करना होगा। एक सामान्य रूप से संबंधपरक डेटाबेस में ऐसा नहीं करता है। आपको प्रोग्राम में समूह करना चाहिए, एसक्यूएल में नहीं (डुप्लिकेट आईडी का पता लगाएं और अपने प्रोग्राम में उन एरे बनाएं)। – leemes

0

डुप्लीकेट से छुटकारा पाने के लिए, आप drinks.id से समूह कर सकते हैं। लेकिन इस तरह आप प्रत्येक drinks.id के लिए केवल एक फोटो प्राप्त करेंगे (जो तस्वीर आपको मिलेगी डेटाबेस आंतरिक कार्यान्वयन पर निर्भर करती है)।

हालांकि यह दस्तावेज नहीं है, MySQL के मामले में, आपको सबसे कम id (मेरे अनुभव में मैंने कभी अन्य व्यवहार नहीं देखा है) के साथ फोटो प्राप्त होगा।

SELECT name, price, photo 
FROM drinks, drinks_photos 
WHERE drinks.id = drinks_id 
GROUP BY drinks.id 
+1

आपको आईडी द्वारा बेहतर समूह बनाना चाहिए। स्रोत तालिका की अलग-अलग पंक्तियां प्राप्त करने के लिए हमेशा अपने अद्वितीय फ़ील्ड द्वारा समूहित करें। आपके मामले में, यदि दो पेय का एक ही नाम है (लेकिन तालिका में अलग पंक्तियां हैं) तो आप उन्हें एक साथ समूहित करेंगे। – leemes

+0

धन्यवाद लीम, मैंने नहीं देखा कि अद्वितीय आईडी फ़ील्ड है। मैंने अपना जवाब संपादित कर लिया है। निश्चित रूप से आईडी का उपयोग बेहतर है। @ypercube, क्या आप वास्तव में सोचते हैं, कि आपकी टिप्पणी पोस्ट करने के लिए कुछ सामान्य जोड़ती है? – bhovhannes

+0

@bhovhannes: नहीं, आप सही हैं, क्षमा करें। Snarky टिप्पणियां कुछ भी उपयोगी नहीं जोड़ते हैं। सही उत्तर बेहतर है - हालांकि मैं अभी भी 'ग्रुप बाय' (जो कि एसक्यूएल-मानक नहीं है) के इस उपयोग से असहमत है, यह बताए बिना कि यह क्यों काम करता है और यह प्रत्येक पेय के लिए अर्द्ध-यादृच्छिक 'फोटो' कैसे वापस करेगा। (* * "पहली" * * में "आपको पहली तस्वीर मिल जाएगी" * वाक्यांश सिर्फ गलत है)। –

2

आपके यहां नाम और मूल्य के लिए डुप्लिकेट मान होंगे। और ids drinks_photos तालिका में डुप्लिकेट हैं। आप उनसे बचने का कोई तरीका नहीं हैं। इसके अलावा आप आउटपुट को वास्तव में क्या चाहते हैं?

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