2012-03-29 37 views
0

的頂部實例我有一個表像下面:MySQL查詢爲獲得一類

COL1 | COL2 | COL3 
______________________ 
ITEM1 | CLASS1 | DATE1 
ITEM2 | CLASS3 | DATE2 
ITEM3 | CLASS1 | DATE3 
ITEM4 | CLASS2 | DATE4 
ITEM5 | CLASS1 | DATE2 
ITEM6 | CLASS3 | DATE6 
ITEM7 | CLASS2 | DATE3 
. 
. 

我想安排由降日的數據,然後獲得前2項,每類。我無法弄清楚如何做到這一點。請幫忙。

回答

4

試試這個查詢,它將它記錄在一個組中,然後用排名來過濾結果 -

SELECT col1, col2, col3 FROM (
    SELECT e1.*, COUNT(*) p FROM entries e1 
    LEFT JOIN entries e2 
     ON e1.col2 = e2.col2 AND e1.col3 <= e2.col3 
    GROUP BY e1.col2, e1.col3 
) t 
WHERE p < 3 

+-------+--------+-------+ 
| col1 | col2 | col3 | 
+-------+--------+-------+ 
| ITEM5 | CLASS1 | DATE2 | 
| ITEM3 | CLASS1 | DATE3 | 
| ITEM7 | CLASS2 | DATE3 | 
| ITEM4 | CLASS2 | DATE4 | 
| ITEM2 | CLASS3 | DATE2 | 
| ITEM6 | CLASS3 | DATE6 | 
+-------+--------+-------+ 
+0

+1這是15分鐘後的最佳反應:) – 2012-03-29 11:16:31

+0

+1也是我的;)更好地使用這個比我建議的怪物更好;) – poncha 2012-03-29 11:24:01

+0

+1好工作;)。 – safarov 2012-03-29 11:26:41

1

Didnt嘗試,請給一個嘗試:

SELECT t.*, max(col3) as `date` /* Most recent date */ 
    FROM table t 
    GROUP BY col2 

UNION 

SELECT t2.*, max(col3) as `date` /* second recent date */ 
    FROM table t2 
    WHERE col3 NOT IN 
    (SELECT max(col3) WHERE col2 = t2.col2 GROUP BY col2) 
    GROUP BY col2 
+1

第二個查詢不應該有一個組? – 2012-03-29 11:17:34

+0

不僅是子查詢,而且查詢本身(聯合後的查詢)應該是按查詢分組。事實上,將返回一個單一的值。而你錯過了SELECT子句中的其餘部分。 – 2012-03-29 11:27:05

+0

固定,反正有比這更好的解決方案 – safarov 2012-03-29 11:29:19

0

嘗試......

(
SELECT t1.* FROM the_table t1 
    LEFT JOIN the_table t2 ON t2.col2=t1.col2 AND t2.col3<t1.col3 
    LEFT JOIN the_Table t3 ON t3.col2=t2.col2 AND t3.col3<t2.col3 
WHERE t3.col2 IS NULL AND t2.col2 IS NOT NULL 
ORDER BY t1.col2,t1.col3 DESC 
) 
UNION 
(
SELECT t4.* FROM the_table t4 
    LEFT JOIN the_table t5 ON t4.col2=t5.col2 AND t4.col1!=t5.col1 
    LEFT JOIN the_Table t6 ON t5.col2=t6.col2 AND t5.col1!=t6.col1 
WHERE t6.col1 IS NULL 
ORDER BY t4.col3 DESC 
) 

注:在聯盟第二部分是用於提取具有小於3點的記錄每行class

+0

更好地使用@ Devart的建議。 – poncha 2012-03-29 11:24:58