2013-01-23 12 views
7

का उपयोग करके नवीनतम प्रविष्टि प्राप्त करें मैं अपने डेटाबेस से कुछ बातचीत खींच रहा हूं। उन्हें उपयोगकर्ता_from कॉलम द्वारा समूहीकृत किया जा रहा है।ग्रुप BY

अभी तक, यह सबसे पुराना संदेश आउटपुट करता है। मैं इसे नवीनतम संदेश दिखाना चाहता हूं।

ऐसा करने का सबसे आसान तरीका क्या है?

SELECT * 
FROM (`mail`) 
JOIN `users` ON `users`.`id` = `mail`.`user_from` 
JOIN `users_info` ON `users_info`.`user_id` = `mail`.`user_from` 
WHERE `user_to` = '1' 
GROUP BY `user_from` 
ORDER BY `mail`.`date` desc 

मेल तालिका

enter image description here

उपयोगकर्ता तालिका (टुकड़ा)

enter image description here

यह वर्तमान कार्यशील कोड है। SecretAgent एजेंसी से मेल यह बजाय दिखाया जाना चाहिये जो enter image description here

+4

@xQbert क्यों ?, नवीनतम संदेश – Lamak

+0

अधिकतम आईडी वाला है, उस मेल को आईडी के रूप में मानते हुए, आप 'mail.id desc' द्वारा ऑर्डर क्यों नहीं करते? या विभिन्न स्थानों से डाले गए ईमेल हैं और उच्चतम ईमेल को नवीनतम ईमेल आवश्यक नहीं है? – SERPRO

+0

यह चाल नहीं करेगा, यह अभी भी * सबसे पुराना * एक –

उत्तर

4

MySQL दुर्भाग्य GROUP BY खंड, जो अविश्वसनीय परिणाम का उत्पादन जब तक आप सभी शामिल की सामग्री के बारे में बहुत उदार है की तुलना में एक संदेश नए भेजा GROUP BY में कॉलम। किसी भी क्वेरी में SELECT * पर इसकी अनुशंसा नहीं की जाती है, लेकिन हम इसे अभी छोड़ देंगे। आपको जो करना है वह सबक्वायरी जॉइन करना है जो उपयोगकर्ता के लिए सबसे हालिया संदेश प्राप्त करता है, शेष कॉलम के खिलाफ शामिल हो जाता है।

SELECT 
    /* Don't actually do this. Be explicit about columns and assign aliases where their names collide */ 
    users.*, 
    users_info.*, 
    mail.* 
FROM 
    `users` 
    JOIN `mail` ON `users`.`id` = `mail`.`user_from` 
    JOIN `users_info` ON `users_info`.`user_id` = `mail`.`user_from` 
    /* Joined subquery gets most recent message from each user */ 
    JOIN (
    SELECT user_from, MAX(date) AS date 
    FROM mail 
    WHERE user_to = '1' 
    GROUP BY user_from 
    /* Joined back to the main mail table on user_from and date */ 
) most_recent ON mail.user_from = most_recent.user_from AND mail.date = most_recent.date 
    WHERE `user_to` =  '1' 

संपादित बल्कि केवल एक से सब हाल ही में प्रेषकों को दिखाने के लिए अपडेट किया गया।

+0

यह PHPMyAdmin में चलते समय काम करता प्रतीत होता है। अब मैं कोडइग्निटर दस्तावेज़ों में बस जाउंगा और देख सकता हूं कि मैं सक्रिय रिकॉर्ड्स का उपयोग करके यह काम कैसे कर सकता हूं। धन्यवाद! :-) –

+0

* दुर्भाग्य से * के लिए +1। एक पार्टी को 100k मनाने के लिए फेंकना? – Kermit

+0

@njk बस सक्रिय रहने की उम्मीद है - मैं अब बहुत अधिक जवाब नहीं देता हूं। कुछ 100k पर "सेवानिवृत्त" लगते हैं। मैं शायद 3 दिन दूर हूं ... –

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