आप यहां जो करते हैं उसे JOIN
कहा जाता है।
(हालाँकि आप इसे परोक्ष रूप से करते हैं क्योंकि आप कई तालिकाओं से चयन करते हैं)। इसका मतलब है, अगर आपने अपने WHERE क्लॉज में कोई शर्त नहीं रखी थी, तो आपके पास सभी संयोजन थे उन तालिकाओं में से। केवल अपनी शर्त के साथ आप अपने शामिल होने को उन पंक्तियों तक सीमित रखते हैं जहां पेय आईडी मेल खाती है।
लेकिन प्रत्येक पेय के परिणाम में अभी भी एक्स एकाधिक पंक्तियां हैं, यदि इस विशेष पेय_आईडी के साथ एक्स तस्वीरें हैं। आपका कथन जो . को प्रतिबंधित नहीं करता है फोटो जो आप लेना चाहते हैं!
यदि आप प्रति पेय केवल एक पंक्ति चाहते हैं, तो आपको SQL को बताना होगा कि यदि किसी विशेष पेय_आईडी के साथ कई पंक्तियाँ हैं तो आप क्या करना चाहते हैं। इसके लिए आपको ग्रुपिंग और एक एग्रीगेट फंक्शनकी जरूरत है। ए> . आप एसक्यूएल को बताते हैं कि आप किन प्रविष्टियों को एक साथ समूहित करना चाहते हैं (उदाहरण के लिए सभी समान पेय_आईड्स) और चयन में, आपको यह बताना होगा कि प्रत्येक समूहीकृत परिणाम पंक्ति के लिए कौन सी विशिष्ट प्रविष्टियां ली जानी चाहिए। संख्याओं के लिए, यह औसत, न्यूनतम, अधिकतम (कुछ नाम रखने के लिए) हो सकता है।
आपके मामले में, यदि आप केवल एक पंक्ति चाहते हैं, तो मैं पेय के लिए फ़ोटो पूछने का अर्थ नहीं देख सकता। आपने शायद सोचा था कि आपके पास फ़ोटो की एक सरणी हो सकती है प्रत्येक पेय के लिए आपके परिणाम में, लेकिन SQL ऐसा नहीं कर सकता। अगर आप केवल कोई भी चाहते हैं फोटो और आपको परवाह नहीं है कि आपको क्या मिलेगा, बस पेय_आईडी द्वारा समूहित करें (प्रति पेय केवल एक पंक्ति प्राप्त करने के लिए):
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
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
हालांकि, यह खतरनाक हो सकता है यदि आपके पास ,
. है फ़ील्ड मानों के भीतर, क्योंकि सबसे अधिक संभावना है कि आप इसे क्लाइंट साइड पर फिर से विभाजित करना चाहते हैं। यह एक मानक SQL एग्रीगेट फ़ंक्शन भी नहीं है।