2009-10-08 24 views
7

मैं इस तरह एक मेज है:MySQL समूह द्वारा

 
Rank  Letter 
1   A 
2   A 
3   B 
4   A 
5   C 
6   A 
7   C 
8   C 
9   B 
10  C 

और मैं प्रत्येक अक्षर आरोही रैंक द्वारा आदेश दिया के शीर्ष 2 की जरूरत है:

 
Rank  Letter 
1   A 
2   A 
3   B 
5   C 
7   C 
9   B 

कैसे होगा मैं करता हूं? यह ग्रुप द्वारा उपयोग करते हुए सिर्फ शीर्ष 1 पाने के लिए काफी सीधा है, लेकिन मैं इसे कई प्रविष्टियाँ

उत्तर

2
select distinct rank, letter 
    from table1 t2 
where rank in 
     (select top 2 rank 
      from table1 t2 
      where t2.letter = t1.letter 
      order by rank) 
     order by letter, rank 

संपादित करें: (मेरी पहली कोशिश MySql (Quassnoi टिप्पणी) पर काम नहीं करेगा, मैं इसे उदाहरण के लिए एसक्यूएल सर्वर पर काम करने के लिए संशोधित)

दूसरा कोशिश:

select t.letter, t.rank 
from table1 t 
join (
    select t1.letter, min(t1.rank) m 
    from table1 t1 
    join (select t0.letter, min(t0.rank) m, count(1) c 
      from table1 t0 group by t0.letter) t2 
    on t1.letter = t2.letter and ((t2.c = 1) or (t2.c > 1 and t1.rank > m)) 
    group by t1.letter) t3 
    on t.letter = t3.letter and t.rank <= t3.m 
+0

'IN' predicate' MySQL' – Quassnoi

+0

में 'LIMIT' के साथ काम नहीं करता है, मैं SQL सर्वर के साथ और अधिक काम करता हूं। अब मुझे mysql के लिए एक और समाधान मिलना है और आपके से अलग;) – manji

7
SELECT mo.Letter, md.Rank 
FROM (
     SELECT DISTINCT letter 
     FROM mytable 
     ) mo 
JOIN mytable md 
ON  md.Letter >= mo.Letter 
     AND md.Letter <= mo.Letter 
     AND Rank <= 
     COALESCE 
       (
       (
       SELECT Rank 
       FROM mytable mi 
       WHERE mi.letter = mo.letter 
       ORDER BY 
         Rank 
       LIMIT 1, 1 
       ), 
       0xFFFFFFFF 
       ) 

आप (Letter, Rank) पर एक समग्र सूचकांक (इस क्रम में) की आवश्यकता है

के लिए काम करने के लिए नहीं कर पा रहे

नोट इस संरचना:

md.Letter >= mo.Letter 
AND md.Letter <= mo.Letter 
मात्र md.Letter = mo.Letter

के बजाय

यह बलों Range checked for each record जो अधिक एफई है ficient। इस बारे में अधिक जानकारी के लिए

:

अपने ब्लॉग में यह लेख देखें।

+0

मैं पिछली सबक्वायरी पर LIMIT 2 के कारण "# 1242 - सबक्वायरी 1 से अधिक पंक्तियां लौटाती है" की त्रुटि हो रही है, क्या आपको पता है कि यह क्यों हो सकता है? – Rik

+0

गलत 'LIMIT', तय किया गया। – Quassnoi

+0

यह एक पुराना उत्तर है, लेकिन मुझे यह उपयोगी लगता है। हालांकि मुझे लगता है कि यह अपेक्षा के अनुसार काफी काम नहीं करता है। यदि किसी पत्र के 2 से कम उदाहरण हैं, उदाहरण के लिए, यह उनमें से कोई भी वापस नहीं करेगा। आप इस तरह कुछ जोड़ सकते हैं: या ( SELECT COUNT (*) Mytable mi से जहां mi.letter = mo.letter ) <= 2) ; –

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