2011-08-29 9 views
7

मेरे सिस्टम में, मेरे पास ग्राहक हैं। ग्राहकों के पास कार्यक्रम हैं। मैं ग्राहकों की एक सूची प्रदर्शित करना चाहता हूं, जो उनके सबसे हालिया सक्रिय (यदि यह मौजूद है) प्रोग्राम दिखा रहा है।समूह के भीतर आदेश?

SELECT * 
FROM clients AS client 
    JOIN programs AS program ON client.id=program.client_id 
GROUP BY client.id 
ORDER BY program.close_date=0 DESC, program.close_date DESC 

close_date=0 का मतलब कार्यक्रम बंद नहीं है:

इस प्रकार, हम कुछ इस तरह की है। तो यह पहले गैर-बंद कार्यक्रमों को रखेगा, और फिर सबसे हाल ही में बंद कार्यक्रमों को आगे रखेगा।

समस्या यह है कि समूह के भीतर काम नहीं करता है। यह यादृच्छिक रूप से कार्यक्रमों में से एक को चुनता है। मैं इसका कैसे समाधान करूं?


बस इस के साथ आया था:

SELECT * 
FROM clients AS client 
    JOIN (SELECT * FROM programs AS program ORDER BY program.close_date=0 DESC, program.close_date DESC) AS program ON client.id=program.client_id 
GROUP BY client.id 

कौन सा सही परिणाम देने के लिए लगता है। क्या यह सही है, या मैं बस भाग्यशाली हो रहा हूँ? यानी, मैंने अनिवार्य रूप से उस पर शामिल होने से पहले टेबल को सॉर्ट किया है; उन परिणामों को हल किया जाएगा क्योंकि यह शामिल है, है ना?


समाधान: मैं अब इस एक क्लासिक group-wise maximum समस्या विश्वास करते हैं। इसके लिए खोजें यदि आप एक ही समस्या पर फंस गए हैं। समाधान में एक ही टेबल में दो बार शामिल होना शामिल है।

+3

उप-चयन में ऑर्डर द्वारा परिणाम पर कोई निर्धारिक प्रभाव नहीं होना चाहिए। यह MySQL के साथ काम करने के लिए हो सकता है, लेकिन एसक्यूएल मानक इसे अनुमति भी नहीं देता है। मुख्य बिंदु क्लाइंट.आईडी द्वारा मुख्य (बाहरी क्वेरी) में आदेश देना है, फिर किसी अन्य कॉलम द्वारा आप चाहते हैं। ग्रुप बाय और ऑर्डर द्वारा क्लॉज में आपको वही चीज़ें कहना पड़ सकता है; ऐसा करने के लिए कुछ भी लागत नहीं है। –

+2

@ मार्क: मुझे नहीं लगता कि आपका वैकल्पिक समाधान (ऊपर पोस्ट किया गया) सही परिणाम देने की गारंटी है। 'Client.id' पर' GROUP BY' किया जाने के बाद, ["सर्वर प्रत्येक समूह से कोई भी रिकॉर्ड चुनने के लिए स्वतंत्र है"] (http://dev.mysql.com/doc/refman/5.0/en/group -by-छुपा-columns.html)। – unutbu

+0

@ubutbu: धन्यवाद! यही वही है जो मैं जानना चाहता था। मैं चिंतित था कि मामला हो सकता है। – mpen

उत्तर

7
SELECT c.*, p.* 
FROM clients AS c 
JOIN programs AS p 
ON  p.id = 
     (
     SELECT pi.id 
     FROM programs AS pi 
     WHERE pi.client_id = c.id 
     ORDER BY 
       pi.close_date=0 DESC, pi.close_date DESC 
     LIMIT 1 
     ) 

Thanx @Quassnoi के पास जाना चाहिए। एक ऐसी ही (लेकिन और अधिक जटिल) प्रश्न में अपने जवाब देखें: mysql-group-by-to-display-latest-result


आप programs तालिका अद्यतन करते हैं और सभी रिकॉर्ड यह है कि के लिए close_date सेट शून्य close_date='9999-12-31' चाहते हैं, फिर ORDER BY आसान हो जाएगा (और उचित इंडेक्स के साथ पूरी क्वेरी तेजी से):

 ORDER BY 
       pi.close_date DESC 
+0

आह ... हाँ, यह जुड़ाव बहुत अधिक समझ में आता है। आपका बहुत बहुत धन्यवाद! – mpen

+0

यह वह उत्तर है जिसे मैंने हर जगह देखा है। – atomkirk

1

खंड द्वारा इस आदेश का प्रयास करें ...

ORDER BY client.id, CASE WHEN program.close_date = 0 THEN 0 ELSE 1 END, program.close_date DESC 
+0

मुझे नहीं लगता कि यह कुछ भी कैसे पूरा करता है। 'program.close_date = 0' पहले ही' 0' या '1' का मूल्यांकन करेगा। समस्या यह है कि मुझे समूहों के भीतर क्रमबद्ध करने की आवश्यकता है, समग्र सॉर्टिंग (समूहबद्ध करने के बाद) ठीक है। – mpen

+2

सूचीबद्ध पहला कॉलम client.id है ... जो आपके समूहों को एक साथ रखेगा। – JSR

+0

ओह ..... आपको अपने उत्तर में यह इंगित करना चाहिए था। हालांकि मैं अभी भी 100% निश्चित नहीं हूं कि इसका मतलब क्या है। 'Client.id' पहले रखना ऑर्डरिंग कार्य करेगा? इससे कोई फर्क क्यों पड़ता है? – mpen

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