मेरे सिस्टम में, मेरे पास ग्राहक हैं। ग्राहकों के पास कार्यक्रम हैं। मैं ग्राहकों की एक सूची प्रदर्शित करना चाहता हूं, जो उनके सबसे हालिया सक्रिय (यदि यह मौजूद है) प्रोग्राम दिखा रहा है।समूह के भीतर आदेश?
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 समस्या विश्वास करते हैं। इसके लिए खोजें यदि आप एक ही समस्या पर फंस गए हैं। समाधान में एक ही टेबल में दो बार शामिल होना शामिल है।
उप-चयन में ऑर्डर द्वारा परिणाम पर कोई निर्धारिक प्रभाव नहीं होना चाहिए। यह MySQL के साथ काम करने के लिए हो सकता है, लेकिन एसक्यूएल मानक इसे अनुमति भी नहीं देता है। मुख्य बिंदु क्लाइंट.आईडी द्वारा मुख्य (बाहरी क्वेरी) में आदेश देना है, फिर किसी अन्य कॉलम द्वारा आप चाहते हैं। ग्रुप बाय और ऑर्डर द्वारा क्लॉज में आपको वही चीज़ें कहना पड़ सकता है; ऐसा करने के लिए कुछ भी लागत नहीं है। –
@ मार्क: मुझे नहीं लगता कि आपका वैकल्पिक समाधान (ऊपर पोस्ट किया गया) सही परिणाम देने की गारंटी है। 'Client.id' पर' GROUP BY' किया जाने के बाद, ["सर्वर प्रत्येक समूह से कोई भी रिकॉर्ड चुनने के लिए स्वतंत्र है"] (http://dev.mysql.com/doc/refman/5.0/en/group -by-छुपा-columns.html)। – unutbu
@ubutbu: धन्यवाद! यही वही है जो मैं जानना चाहता था। मैं चिंतित था कि मामला हो सकता है। – mpen