/ MySQL - sql, sql का उपयोग करते हुए प्रतिष्ठानों के लिए लेफ्ट नवीनतम निरीक्षण तिथि में शामिल हों

MySQL - mysql, sql का उपयोग करके प्रतिष्ठानों को नवीनतम निरीक्षण दिनांक में शामिल हों

मेरे पास प्रतिष्ठानों की एक तालिका है और मैं निरीक्षण तालिका से नवीनतम निरीक्षण तिथि के साथ परिणाम सेट करना चाहता हूं। अभी मेरे पास है:

SELECT business_table.business_name, business_table.address, inspection_table.date
FROM business_table
LEFT JOIN inspection_table ON business_table.id = inspection_table.business_id
WHERE inspection_table.date = (
SELECT MAX(date)
FROM inspection_table)

समस्या यह है कि मुझे केवल एक ही परिणाम मिलता हैनवीनतम निरीक्षण की तारीख। मुझे सभी प्रतिष्ठानों की आवश्यकता है। क्वेरी को कुशल बनाने की आवश्यकता होगी क्योंकि मेरे पास लगभग 600K प्रतिष्ठान और 3Million निरीक्षण हैं।

उत्तर:

जवाब के लिए 0 № 1

आह, आप नवीनतम निरीक्षण तिथि की बिल्कुल भी तलाश नहीं कर रहे हैं। आप नवीनतम निरीक्षण तिथि की तलाश कर रहे हैं प्रति व्यवसाय.

अपने समाधान में आप अभी भी एक बाहरी जुड़ाव का उपयोग कर रहे हैं जो "t काम नहीं करता है"। या तो किसी बाहरी जॉइन का उपयोग करें और इसे ठीक से उपयोग करें या यदि आप उसके साथ ठीक हैं तो एक आंतरिक जॉइन का उपयोग करें।

यहां बताया गया है कि बाहरी जुड़ाव के साथ प्रति व्यवसाय का नवीनतम निरीक्षण कैसे किया जाता है (इसलिए आप ऐसे व्यवसाय भी दिखाएं जिनका अभी तक कोई निरीक्षण नहीं हुआ है):

SELECT
b.business_name,
b.address,
i.date,
...
FROM business_table b
LEFT JOIN inspection_table i
ON  i.business_id = b.id
AND (i.business_id, i.date) IN
(
SELECT business_id, MAX(date)
FROM inspection_table
GROUP BY business_id
);

समान के साथ:

SELECT
b.business_name,
b.address,
i.date,
...
FROM business_table b
LEFT JOIN
(
SELECT business_id, MAX(date) AS date
FROM inspection_table
GROUP BY business_id
) latest ON latest.business_id = b.id
LEFT JOIN inspection_table i
ON  i.business_id = latest.business_id
AND i.date        = latest.date;

उत्तर № 2 के लिए 1

आप बाहरी जुड़ाव का उपयोग कर रहे हैं। जब व्यवसाय रिकॉर्ड में कोई निरीक्षण निरीक्षण रिकॉर्ड नहीं होता है, तो एक खाली निरीक्षण रिकॉर्ड बनाया जाता है इसके बजाय एक सम्मिलित हो जाता है। ताकि बाहरी-सम्मिलित निरीक्षण रिकॉर्ड में सभी कॉलम NULL होंगे। फिर आपके पास है WHERE inspection_table.date = (...)। यह सभी बाहरी सम्मिलित रिकॉर्ड को फिर से खारिज कर देता है, क्योंकि NULL का कभी मिलान नहीं होगा।

उपयोग AND इसके बजाय, हालत का हिस्सा बनाने के लिए WHERE खंड:

SELECT
b.business_name,
b.address,
i.date
FROM business_table b
LEFT JOIN inspection_table i
ON  i.business_id = b.id
AND i.date        = (SELECT MAX(date) FROM inspection_table);

जवाब के लिए 0 № 3

मैंने निम्नलिखित का उपयोग कर समाप्त किया:

SELECT business_table.business_name AS Name, business_table.address AS Address, business_table.city AS City, business_table.state AS Province, inspection_table.rating AS Rating, inspection_table.date AS "Inspected"
FROM business_table
LEFT JOIN inspection_table ON business_table.id = inspection_table.business_id
WHERE inspection_table.date = (
SELECT MAX(inspection_table.date)
FROM inspection_table
WHERE business_table.id = inspection_table.business_id)
ORDER BY inspection_table.date DESC