कई कॉलम पर INNER JOIN कैसे करें


168

मैं एक होमवर्क प्रोजेक्ट पर काम कर रहा हूं और मैं एक डेटाबेस क्वेरी करने वाला हूं, जो शहर के नाम या हवाई अड्डे के कोड द्वारा उड़ानों का पता लगाता है, लेकिन flightsतालिका में केवल हवाई अड्डा कोड होते हैं, इसलिए यदि मुझे शहर से खोजना हो airportsमेज पर शामिल हों ।

एयरपोर्ट्स टेबल में निम्नलिखित कॉलम होते हैं: code, city
फ्लाइट टेबल में निम्नलिखित कॉलम होते हैं: airline, flt_no, fairport, tairport, depart, arrive, fare
कॉलम fairportऔर एयरपोर्ट कोड के लिए और सेtairport होते हैं । कॉलम और प्रस्थान और आगमन की तारीखों हैं।
departarrive

मैं एक प्रश्न के साथ आया था जो पहले fairportकॉलम और कॉलम पर उड़ानों में शामिल होता है airports.code। मैच के लिए मुझे tairportपहले मैच में पिछले मैचों में एक और प्रदर्शन करना होगा।

SELECT airline, flt_no, fairport, tairport, depart, arrive, fare
    FROM (SELECT * FROM flights
        INNER JOIN airports
        ON flights.fairport = airports.code
        WHERE (airports.code = '?' OR airports.city='?')) AS matches
    INNER JOIN airports
    ON matches.tairport = airports.code
    WHERE (airports.code = '?' OR airports.city = '?')

मेरी क्वेरी उचित परिणाम देती है और यह होमवर्क के उद्देश्य के लिए पर्याप्त होगा, लेकिन मैं सोच रहा हूं कि क्या मैं JOINकई कॉलमों पर कर सकता हूं ? मैं WHEREक्लॉज़ का निर्माण कैसे करूँगा ताकि यह प्रस्थान और गंतव्य शहर / कोड से मेल खाए?

नीचे एक "छद्म-प्रश्न" है, जिसे मैं स्वीकार करना चाहता हूं, लेकिन मुझे वाक्यविन्यास सही ढंग से नहीं मिल रहा है और मुझे नहीं पता कि airportsप्रस्थान और गंतव्य के लिए तालिका का प्रतिनिधित्व कैसे करें :

SELECT * FROM flights
INNER JOIN airports
ON flights.fairport = airports.code AND flights.tairport = airports.code
WHERE (airports.code = 'departureCode' OR airports.city= 'departureCity') 
    AND (airports.code = 'destinationCode' OR airports.city = 'destinationCity')

अपडेट करें

मैंने एसक्यूएल के इस दृश्य निरूपण को भी पाया कि एसक्यूएल स्टेटमेंट के निर्माण के बारे में एक सामान्य मार्गदर्शक के रूप में बहुत उपयोगी होने के लिए बयानों में शामिल हों !


3
संकेत: आपको प्रत्येक रिकॉर्ड के लिए दो शहरों को देखने की जरूरत है (एक फ़ेयरपोर्ट के लिए और दूसरा टैरोपोर्ट के लिए। यह इसलिए ठीक है (वास्तव में आवश्यक है) दो जॉइन करने के लिए, एयरपोर्ट टेबल के साथ, लेकिन उनमें से एक फेयरपोर्ट पर आधारित है। tairport पर।
mjv

2
Hint2: इसलिए आपको हवाईअड्डे की तालिका को भी बदल देना होगा ताकि आप जान सकें कि उन्हें कैसे अलग किया जा सकता है (यानी जो हवाई अड्डे की मेज फेयरपोर्ट लुकअप के साथ और टैरपोर्ट लुकअप के साथ है)। उपनाम के लिए एसक्यूएल कीवर्ड के रूप में है (हालांकि यह छोड़ा जा सकता है, यानी ... जॉय एयरपोर्ट [एएस] एफए पर कोड के अनुसार एफएओकोड = फ्लाइट.टेयरपोर्ट ...)
एमजेवी

जवाबों:


141

आप में शामिल हो गए टेबल एक देकर एक बार से अधिक एक ही मेज के साथ शामिल हों सकते हैं उर्फ , निम्न उदाहरण में:

SELECT 
    airline, flt_no, fairport, tairport, depart, arrive, fare
FROM 
    flights
INNER JOIN 
    airports from_port ON (from_port.code = flights.fairport)
INNER JOIN
    airports to_port ON (to_port.code = flights.tairport)
WHERE 
    from_port.code = '?' OR to_port.code = '?' OR airports.city='?'

ध्यान दें कि to_portऔर तालिका from_portकी पहली और दूसरी प्रतियों के लिए उपनाम हैं airports


ठीक है, मैंने उपरोक्त समाधान की कोशिश की और निम्नलिखित त्रुटि हुई: आपके SQL सिंटैक्स में कोई त्रुटि है; पंक्ति 7 पर 'INNER_JOIN हवाई अड्डों के लिए to_port ON (to_port.code = flight.tairport) WHERE' के पास उपयोग करने के लिए सही सिंटैक्स के लिए आपके MySQL सर्वर संस्करण से मेल खाने वाले मैनुअल की जाँच करें
किरिल

2
ओह, मुझे पता है क्यों :) यह INNER JOIN नहीं INNER_JOIN माना जाता है ... DOH!
किरिल

21
यदि हवाईअड्डे की मेज बहुत बड़ी है, तो क्या यह बेहतर है कि इसे एक बार में एक ही बार में एक साथ जोड़ दें। कुछ इस तरह - flights f INNER JOIN airports a ON a.code = f.fairport OR a.code = f.tairportकृपया सुझाव दें।
अंकुर-एम

26

कुछ इस तरह....

SELECT f.*
      ,a1.city as from
      ,a2.city as to
FROM flights f
INNER JOIN airports a1
ON f.fairport = a1. code
INNER JOIN airports a2
ON f.tairport = a2. code

1
मैंने इसे ऊपर पूछा है, सोचा था कि यहां भी पूछेंगे - यदि हवाईअड्डा तालिका बहुत बड़ी है (और WHERE की स्थिति का उपयोग करके पूरी क्वेरी के लिए और अधिक फ़िल्टर है), तो क्या यह बेहतर है कि इसे एक बार में एक से अधिक स्थिति में मिलाएं। कुछ इस तरह - flights f INNER JOIN airports a ON a.code = f.fairport OR a.code = f.tairportक्या इससे कोई फर्क पड़ता है? तुम क्या सोचते हो?
अंकुर-एम

1
इससे परिणामों पर फर्क पड़ता है, पूर्व में प्रति उड़ान से एक पंक्ति का उत्पादन होता है और, आपके सुझाव में प्रति उड़ान 2 पंक्तियाँ, एक पंक्ति से एक और हवाई अड्डे से एक का उत्पादन होगा। हालांकि यह केवल एक बार शामिल होने के लिए तेज़ होगा।
पॉल क्रीसी

19

अगर mysql आपके लिए ठीक है:

SELECT flights.*, 
       fromairports.city as fromCity, 
       toairports.city as toCity
FROM flights
LEFT JOIN (airports as fromairports, airports as toairports)
ON (fromairports.code=flights.fairport AND toairports.code=flights.tairport )
WHERE flights.fairport = '?' OR fromairports.city = '?'

संपादित करें: कोड या शहर के लिए आउटपुट को फ़िल्टर करने के लिए जोड़ा गया उदाहरण


12

क्या आप सिर्फ और सिर्फ क्लॉज में इस्तेमाल कर सकते हैं?

उदाहरण के लिए, कुछ इस तरह:

SELECT 
   airline, flt_no, fairport, tairport, depart, arrive, fare
FROM 
   flights
INNER JOIN 
   airports from_port ON (from_port.code = flights.fairport)
   and (to_port.code = flights.tairport)

4
14 अपवित्रों के लिए पृथ्वी पर यह कैसे हुआ? वाक्य और अर्थ दोनों में कथन गलत है।
ultracrepidarian

3

यदि आप FROM और TO दोनों हवाईअड्डों पर खोजना चाहते हैं, तो आप दो बार एयरपोर्ट्स टेबल पर जुड़ना चाहेंगे - फिर आप अपने परिणाम सेट में और टेबल से दोनों का उपयोग कर सकते हैं:

SELECT
   Flights.*,fromAirports.*,toAirports.*
FROM
   Flights
INNER JOIN 
   Airports fromAirports on Flights.fairport = fromAirports.code
INNER JOIN 
   Airports toAirports on Flights.tairport = toAirports.code
WHERE
 ...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.