मैं अपने संबंधपरक डेटाबेस में 5 तालिकाओं के आधार पर सामग्री प्रदर्शित करने का प्रयास कर रहा हूं। परिदृश्य: मैं फोन लाइनों के आधार पर सेवाएं बेचता हूं। तालिकाएँ शामिल हैं: आदेश (ग्राहक और अनुबंध के बारे में जानकारी रखना), अनुबंध (आदेश को मेरे कर्मचारी के साथ जोड़ना जो इसकी देखभाल करेगा), कर्मचारी, संख्या (संख्या के बारे में जानकारी रखना, 1 या अधिक एक्सटेंशन से जुड़ना) और विस्तार तालिका। तालिकाएं

CONTRACT      ORDERS    EMPLOYEE    NUMBER       EXTENSIONS
--------    ----------- --------    ------       ----------
contract_id order_id    employee_id phone_number extension_id
employee_id location    name        contract_id  phone_number   
order_id    description ...     ...     ...
...   

मेरी समस्या यह है कि डेटा कई अलग-अलग चरणों में पॉप्युलेट हो जाता है, इसलिए यदि मैं WHERE क्लॉज का उपयोग करके सभी तालिकाओं को एक साथ जोड़ता हूं तो कोई डेटा प्रदर्शित नहीं होता है। (कृपया निम्नलिखित प्रश्न देखें)

SELECT  orders.location as service_location, contract.employee_id as id, 
        employee.name as name, number.phone_number as phone, 
        extension.extension_number as extension, contract.order_id AS order_id
FROM  orders,
      contract,
      employee,
      number,
      extensions
WHERE orders.client_id = 1
  and orders.order_id = contract.order_id 
  AND contract.employee_id = employee.employee_id
  AND contract.contract_id = number.contract_id
  AND number.phone_number = extensions.phone_number

मुझे लगता है कि मैं उपरोक्त कोड का उपयोग कर सकता हूं यदि फोन_नंबर (टीबीएल नंबर) और एक्सटेंशन (टीबीएल एक्सटेंशन) पहले से ही डीबी में मौजूद हैं (जैसा कि मैं नंबर और एक्सटेंशन टेबल का उपयोग करने से पहले इच्छित परिणाम प्राप्त करता हूं)। मेरे परिदृश्य में यदि वे मौजूद नहीं हैं तो मुझे शेष तालिका की आबादी की आवश्यकता होगी और इन दो स्तंभों को खाली फ़ील्ड वापस करने के लिए जब तक वे PHP इंटरफ़ेस के माध्यम से पॉप्युलेट नहीं हो जाते। क्या जॉइन मेरी समस्या का समाधान करेगा? इसे मेरे परिदृश्य में कैसे अनुकूलित करें?

अपेक्षित परिणाम:

service_location| id       |  name | order_id | phone  | extension 
--------------  | ---------| ------| -------- |  ----- | ---------
-1
Mal_235 12 नवम्बर 2019, 14:00

1 उत्तर

सबसे बढ़िया उत्तर

आपको पहले स्पष्ट जॉइन सिंटेक्स का उपयोग करना चाहिए, और फिर सही जॉइन करने के लिए ऑन क्लॉज का उपयोग करना चाहिए। मैंने लेफ्ट जॉइन का उपयोग किया है, लेकिन यदि आपकी ज़रूरतें हैं तो आप अन्य जॉइन का उपयोग कर सकते हैं।

SELECT  a.location as service_location, b.employee_id as id, 
        c.name as name, d.phone_number as phone, 
        e.extension_number as extension, b.order_id AS order_id
FROM  orders a
    LEFT JOIN contract b on a.order_id = a.order_id 
    LEFT JOIN employee c on a.employee_id = c.employee_id
    LEFT JOIN `number` d on a.contract_id = d.contract_id
    LEFT JOIN extensions e on d.phone_number = e.phone_number
WHERE a.client_id = 1
3
nacho 12 नवम्बर 2019, 14:09