2010-05-23 5 views
6

(http://www.tizag.com/mysqlTutorial/mysqlmax.php से) इस तालिका पर विचार करें:SQL MAX फ़ंक्शन का उपयोग कर पंक्ति के सभी फ़ील्ड कैसे प्राप्त करें?

Id  name    type  price 
123451 Park's Great Hits Music 19.99 
123452 Silly Puddy  Toy  3.99 
123453 Playstation  Toy  89.95 
123454 Men's T-Shirt  Clothing 32.50 
123455 Blouse    Clothing 34.97 
123456 Electronica 2002 Music 3.99 
123457 Country Tunes  Music 21.55 
123458 Watermelon   Food  8.73 

यह SQL क्वेरी प्रत्येक प्रकार से सबसे महंगी आइटम रिटर्न: चयन प्रकार, मैक्स (कीमत) उत्पादों ग्रुप से प्रकार

Clothing $34.97 
Food  $8.73 
Music $21.55 
Toy  $89.95 

मैं द्वारा फ़ील्ड आईडी और नाम जो प्रत्येक पंक्ति के लिए उपर्युक्त अधिकतम मूल्य से संबंधित है, प्राप्त करना चाहते हैं। क्या SQL क्वेरी इस तरह की तालिका वापस कर देगी?

Id  name   type  price 
123455 Blouse   Clothing 34.97 
123458 Watermelon  Food  8.73 
123457 Country Tunes Music  21.55 
123453 Playstation  Toy  89.95 
+0

आप डीबीएमएस है कि आप प्रयोग कर रहे हैं के लिए उचित रूप से अपने प्रश्न को टैग कर सकते हैं: उदाहरण के लिए, यदि अधिक से अधिक Id मूल्य के साथ उत्पाद जीत चाहिए, तो आप टाई इस तरह से हल कर सकते हैं? –

+0

हां, मैंने फायरबर्ड 2.1 –

+0

जोड़ा कि संबंधों को कैसे संभाला जाना चाहिए? क्या आप प्रति माह केवल एक आइटम चाहते हैं, या अधिकतर सामानों के लिए टाई होने पर कई आइटम चाहते हैं? –

उत्तर

6

यह greatest-n-per-group समस्या है जो अक्सर आता है। यह हल के लिए मेरे हमेशा की तरह तार्किक @Martin स्मिथ द्वारा दिए गए जवाब के बराबर है, लेकिन एक सबक्वेरी का उपयोग नहीं करता:

SELECT T1.Id, T1.name, T1.type, T1.price 
FROM Table T1 
LEFT OUTER JOIN Table T2 
    ON (T1.type = T2.type AND T1.price < T2.price) 
WHERE T2.price IS NULL; 

मेरे समाधान और अन्य सभी इस सूत्र पर दिए गए अब तक कई पंक्तियों के उत्पादन का एक मौका है type का प्रति मान, यदि एक से अधिक उत्पाद एक ही प्रकार के शेयर साझा करते हैं और दोनों के बराबर मूल्य होता है जो अधिकतम है। इसे हल करने और टाई तोड़ने के तरीके हैं, लेकिन आपको हमें यह बताना होगा कि इस तरह के उत्पाद "जीत" कौन सा है।

आपको कुछ अन्य गुणों की आवश्यकता है जो कम से कम type के साथ पंक्तियों के लिए सभी पंक्तियों पर अद्वितीय होने की गारंटी है।

SELECT T1.Id, T1.name, T1.type, T1.price 
FROM Table T1 
LEFT OUTER JOIN Table T2 
    ON (T1.type = T2.type AND (T1.price < T2.price 
     OR T1.price = T2.price AND T1.Id < T2.Id)) 
WHERE T2.price IS NULL; 
+0

धन्यवाद बिल, दूसरी क्वेरी बिल्कुल वही थी जो मैं खोज रहा था। यह एक छोटी सी क्वेरी है लेकिन मेरे लिए जटिल है। –

+0

हर बार पॉप अप होने पर इस प्रश्न का उत्तर देने के लिए धन्यवाद। मैं भूल जाता हूं कि यह हर 3 महीने या उससे भी ज्यादा कैसे करें और अपने स्वयं से जुड़े समाधान की तरह बहुत कुछ करें। – TMG

+0

@ टीएमजी: आपको मेरी जल्द से जल्द जारी की गई पुस्तक, * एसक्यूएल एंटीपाटरर्न * [http://is.gd/b40bn] पसंद हो सकती है। मेरे पास 'ग्रुप बाय' पर एक अध्याय है। आप इस बाहरी समाधान समाधान के साथ पृष्ठ पर एक बुकमार्क डाल सकते हैं! :-) –

6

संपादित बस मेरा अद्यतन करने स्पष्ट आवश्यकता

SELECT Id, name, type,price 
FROM Table T1 
WHERE NOT EXISTS(
      SELECT * FROM TABLE T2 
      WHERE T1.type=t2.type 
      AND T2.Price >= T1.Price 
      AND T2.Id > T1.Id 
     ) 
+0

+1: यह किसी भी SQL बोली के लिए काम करेगा। :) – Simon

+0

+1 आह हाँ, मैंने इसे पहले ऐसा किया है, लेकिन साल में केवल कुछ बार एसक्यूएल है, मैं यह सुनिश्चित करने के लिए चाल से अधिक भूल जाता हूं कि आपको अधिकतम मिला है। – mdma

+0

दुर्भाग्य से जब तक आप अपना उत्तर संपादित नहीं करते हैं तब तक मैं ऊपर नहीं जा सकता ... एक जगह जोड़ता है, कृपया? :) – Simon

3

पूरा करने के लिए आप एक subselect साथ यह कर सकते हैं

SELECT id, name, type, price FROM products p1 
WHERE EXISTS (Select type, max(price) FROM Products p2 
       GROUP BY type 
       WHERE p1.type=p2.type AND p1.price=p2.MAX(price)) 

या एक आंतरिक में शामिल होने

SELECT id, name, type, price FROM products p1 
INNER JOIN (Select type, max(price) FROM Products p2 GROUP BY type) maxPrice 
     ON maxPrice=price=p1.price AND maxPrice.type=p1.price 
+0

धन्यवाद mdma, लेकिन यदि एक ही अधिकतम मूल्य वाले एक से अधिक आइटम हैं और टाइप करें तो यह दोनों को लौटाता है, लेकिन मैं केवल एक –

+0

ठीक है। मुझे लगता है कि पहले से ही एक अच्छा जवाब चुना गया है, इसलिए इसे अद्यतन करने की कोई आवश्यकता नहीं है। – mdma

संबंधित मुद्दे