MySQL

2012-02-08 4 views
14

में प्रत्येक 'समूह' की 'आखिरी' पंक्ति लौट रहा है क्या निम्नलिखित करने का एक और अधिक प्रभावी तरीका है?MySQL

select * 
    from foo as a 
    where a.id = (select max(id) from foo where uid = a.uid group by uid) 
    group by uid; 
) 

इस उत्तर समान दिखता है, लेकिन यह ऐसा करने का सबसे अच्छा तरीका है का जवाब है - How to select the first row for each group in MySQL?

धन्यवाद,

क्रिस।

पीएस

CREATE TABLE foo (
    id INT(10) NOT NULL AUTO_INCREMENT, 
    uid INT(10) NOT NULL, 
    value VARCHAR(50) NOT NULL, 
    PRIMARY KEY (`id`), 
    INDEX `uid` (`uid`) 
) 

डेटा::

id, uid, value 
1, 1, hello 
2, 2, cheese 
3, 2, pickle 
4, 1, world 

परिणाम:

id, uid, value 
3, 2, pickle 
4, 1, world 

अधिक जानकारी के लिए http://www.barricane.com/2012/02/08/mysql-select-last-matching-row.html देखें तरह तालिका लग रहा है।

+0

यह एक सहसंबंधित सबक्वायरी है। आमतौर पर, देवर्ट के उदाहरण के अनुसार, एक असंबंधित सबक्वायरी तेजी से साबित होगी। – Strawberry

+0

संभावित डुप्लिकेट [प्रत्येक समूह में अंतिम रिकॉर्ड पुनर्प्राप्त करना] (http: // stackoverflow।कॉम/प्रश्न/1313120/प्रत्येक-समूह को अंतिम-रिकॉर्ड-इन-ग्रुप) –

उत्तर

33

इस क्वेरी का प्रयास करें -

SELECT t1.* FROM foo t1 
    JOIN (SELECT uid, MAX(id) id FROM foo GROUP BY uid) t2 
    ON t1.id = t2.id AND t1.uid = t2.uid; 

फिर EXPLAIN का उपयोग क्वेरी का विश्लेषण करने के लिए।


SELECT t1.* FROM foo t1 
    LEFT JOIN foo t2 
    ON t1.id < t2.id AND t1.uid = t2.uid 
WHERE t2.id is NULL; 
+0

यह एक दृश्य के रूप में काम नहीं करता है - मुझे "त्रुटि 1349 (एचवाई000) मिलती है: देखें के चयन में खंड से एक सबक्वायरी है" जबकि मेरा कोड करता है। – fadedbee

+1

मुझे नहीं पता था कि आप इसे देखने के लिए उपयोग करने जा रहे थे। ... मैंने एक और जोड़ा है। – Devart

+0

धन्यवाद, मुझे सभी तीन विकल्पों पर कुछ परीक्षण करना होगा और वापस रिपोर्ट करना होगा। (मैंने सबक्वायरी को एक अलग दृश्य बनाकर विचारों के लिए अपना पहला समाधान काम करने में कामयाब रहे।) – fadedbee

2

यदि तालिका आकार में बड़ा है। सभी अंतिम पंक्ति आईडी

create view lastrecords as (select max(id) from foo where uid = a.uid group by uid) 

अब इस view के साथ अपने मुख्य क्वेरी में शामिल होने से युक्त बनाने view। यह तेज़ होगा।

SELECT t1.* FROM tablename as t1 
    JOIN lastrecords as t2 
    ON t1.id = t2.id AND t1.uid = t2.uid; 

या आप क्वेरी भी प्रत्यक्ष पिछले रिकॉर्ड के साथ शामिल हो कर सकते हैं:

SELECT t1.* FROM tablename as t1 
JOIN (SELECT uid, MAX(id) id FROM tablename GROUP BY id) as t2 
ON t1.id = t2.id AND t1.uid = t2.uid; 
0

यह मैं धन्यवाद के लिए काम किया है!

SELECT t1.* FROM foo t1 
    JOIN (SELECT uid, MAX(id) id FROM foo GROUP BY uid) t2 
    ON t1.id = t2.id AND t1.uid = t2.uid; 

मेरी संस्करण:

SELECT * FROM messages t1 JOIN (SELECT MAX(id) id FROM messages where uid = 8279 and actv=1 GROUP BY uid) t2 ON t1.id = t2.id ORDER BY datex desc LIMIT 0,10; 

इस कोड के नीचे सभी पंक्तियों मैं चाहता हूँ वापस नहीं करता है क्योंकि अगर अधिकतम आईडी स्तंभ एक निष्क्रिय एक है तो यह समूह भले ही समूह सक्रिय पंक्तियां हैं छोड़ देता है। ।

select * from messages where uid = 8279 and actv=1 and id In (Select max(id) From messages Group By uid) order by datex desc; 
4

WHERE खंड के साथ MySQL में प्रत्येक GROUP BY की अंतिम पंक्ति लौटने वाले:

SELECT * 
FROM foo 
WHERE id IN (
    SELECT Max(id) 
    FROM foo 
    WHERE value='XYZ' 
    GROUP BY u_id 
) 
LIMIT 0,30 
1

सबसे आसान तरीका: आप से चयनित सूची का चयन कर सकते हैं जो क्रमबद्ध है।

SELECT * FROM (SELECT * FROM foo order by id DESC) AS footbl 
group by uid 
order by id DESC