mysql

2009-09-08 8 views
24

में कहां और आंतरिक शामिल होने का उपयोग करते हुए मेरे पास तीन टेबल हैं।mysql

स्थानों

ID | NAME | TYPE | 
1 | add1 | stat | 
2 | add2 | coun | 
3 | add3 | coun | 
4 | add4 | coun | 
5 | add5 | stat | 

स्कूलों

ID | NAME 
1 | sch1  
2 | sch2 
3 |sch3 

school_locations

ID |LOCATIONS_ID |SCHOOL_ID 
1 | 1   |1 
2 | 2   |2 
3 | 3   |3 

यहाँ तालिका loc आयनों में आवेदन के सभी स्थान होते हैं। स्कूल के लिए स्थान आईडी के द्वारा बुलाए जाते हैं।

जब मैं क्वेरी का उपयोग

select locations.name from locations where type="coun"; 

इसके साथ प्रकार "देश"

नाम प्रदर्शित करता है लेकिन मैं locations.name प्रदर्शित करने के लिए जहां केवल school_locations प्रकार = "देश" करना चाहते हैं

मैं निम्नलिखित प्रश्नों का प्रयास किया, लेकिन कोई भी काम नहीं कर रहा है

select locations.name 
from locations 
where type="coun" 
inner join school_locations 
    on locations.id=school_locations.location_id 
inner join schools 
    on school_locations.school.id=schools.id; 

और

select locations.name 
from locations 
inner join school_locations 
    on locations.id=school_locations.location_id 
inner join schools 
    on school_locations.school.id=schools.id where type="coun"; 

प्रश्नों में एकाधिक आंतरिक जुड़ने का उपयोग करना संभव है, या कोई और तरीका है?

SELECT Locations.Name, Schools.Name 
FROM Locations 
INNER JOIN School_Locations ON School_Locations.Locations_Id = Locations.Id 
INNER JOIN Schools ON School.Id = Schools_Locations.School_Id 
WHERE Locations.Type = "coun" 

आप स्कूल के लिए School_Locations के लिए स्थान का और उसके बाद School_Locations शामिल हो सकते हैं:

उत्तर

45
SELECT `locations`.`name` 
     FROM `locations` 
INNER JOIN `school_locations` 
     ON `locations`.`id` = `school_locations`.`location_id` 
INNER JOIN `schools` 
     ON `school_locations`.`school_id` = `schools_id` 
    WHERE `type` = 'coun'; 

WHERE खंड बयान

+0

बैकटिक msql में की आवश्यकता है? –

+2

नहीं, लेकिन मुझे उन्हें वहां रखना पसंद है, यह अजीब टेबल या कॉलम नामों (जैसे चयन, गिनती,% बी इत्यादि) के साथ समस्याओं से बचाता है और यह अधिक मूर्खतापूर्ण है – knittl

+4

दुर्भाग्यवश, क्वेरी गैर-एएनएसआई-अनुपालन करता है , यदि आप किसी अन्य डेटाबेस में क्वेरी माइग्रेट करने का प्रयास करते हैं तो संभावित रूप से समस्याएं उत्पन्न होती हैं। पहचानकर्ताओं को सीमित करने का उचित तरीका "डबलक्वॉट्स" के साथ है, लेकिन MySQL डिफ़ॉल्ट रूप से इसका समर्थन नहीं करता है; आपको यह प्राप्त करने के लिए SQL_MODE में ANSI_QUOTES सेट करना होगा। बेशक यह आपके स्ट्रिंग शाब्दिक "देश" को गड़बड़ कर देता है, जिसे SQL_MODE को सिंगल कोट्स के साथ लिखा जाना चाहिए। – bobince

2

के अंत में होना करने के लिए इस प्रयास करें है। यह सभी संबंधित स्थानों और स्कूलों का एक सेट बनाता है, जिसे आप WHERE क्लॉज का उपयोग करके नीचे उतर सकते हैं जिनकी स्थिति "देश" है।

0

उतने में मिलती है के रूप में आप चाहते हैं, तथापि, अधिक आप और अधिक का उपयोग यह प्रदर्शन को प्रभावित करेगा

+2

जो उनके प्रश्न का उत्तर नहीं देता – knittl

+1

मैं अलग होना चाहता हूं, प्रश्न में अंतिम वाक्य देखें। निश्चित रूप से मैंने पूरे प्रश्न का उत्तर नहीं दिया, लेकिन मुझे लगा कि दूसरे उत्तरों में से एक ने इसे कवर किया था। – baldy

+1

लेकिन फिर स्टैक ओवरफ्लो शिष्टाचार के अनुसार यह उस विशेष उत्तर पर एक टिप्पणी होनी चाहिए। समझने के लिए धन्यवाद। –

1

इस प्रयास करें उपयोग कर सकते हैं:

SELECT 
    (
     SELECT 
      `NAME` 
     FROM 
      locations 
     WHERE 
      ID = school_locations.LOCATION_ID 
    ) as `NAME` 
FROM 
    school_locations 
WHERE 
    (
     SELECT 
      `TYPE` 
     FROM 
      locations 
     WHERE 
      ID = school_locations.LOCATION_ID 
    ) = 'coun';