2016-05-25 156 views
1

有沒有辦法根據列A和B在MySQL中對結果進行排序,然後將結果限制爲X,如每個值A所示,如ORDER BY A, (B LIMIT X)MySQL ORDER by two columns,limit on one one

假設我有TABLE_A在以下格式:

+------+--------+------+ 
| Col1 | Col2 | Col3 | 
+------+--------+------+ 
| A | 100 | abc | 
| A | 200 | acd | 
| A | 300 | atd | 
| A | 400 | aem | 
| A | 500 | ieb | 
| B | 150 | aio | 
| B | 250 | loe | 
| B | 350 | wmd | 
| B | 450 | zir | 
| B | 550 | oui | 
+------+--------+------+ 

我想獲得與第1列在這裏的每個值相關聯的第2列的X最高值是結果的,如果我想的示例有每個COL1結果前3:

+------+--------+------+ 
| Col1 | Col2 | Col3 | 
+------+--------+------+ 
| A | 500 | ieb | 
| A | 400 | aem | 
| A | 300 | atd | 
| B | 550 | oui | 
| B | 450 | zir | 
| B | 350 | wmd | 
+------+--------+------+ 

我如何能實現不依賴於一個查詢每列1的值,這樣的行爲?

+0

請添加示例數據和預期輸出 –

+0

更新請求的信息 –

+2

這可以幫助:[在SQL中,如何選擇每組的前2行](http://stackoverflow.com/questions/15969614/in-sql - 如何爲每個組選擇前2行)/// [獲取每組分組結果的前n個記錄](http://stackoverflow.com/questions/12113699/get -top-n-records-for-each-group-of-grouped-results) – Amboom

回答

1

嘗試此)

SQL Fiddle

CREATE TABLE table_A 
    (`Col1` varchar(1), `Col2` int, `Col3` varchar(3)) 
; 

INSERT INTO table_A 
    (`Col1`, `Col2`, `Col3`) 
VALUES 
    ('A', 100, 'abc'), 
    ('A', 200, 'acd'), 
    ('A', 300, 'atd'), 
    ('A', 400, 'aem'), 
    ('A', 500, 'ieb'), 
    ('B', 150, 'aio'), 
    ('B', 250, 'loe'), 
    ('B', 350, 'wmd'), 
    ('B', 450, 'zir'), 
    ('B', 550, 'oui') 
; 

查詢1

select a.* 
from table_A a 
left join table_A b on a.Col1 = b.Col1 and a.Col2 <= b.Col2 
group by a.Col1,a.Col2,a.Col3 
having count(*) <=3 
order by a.Col1 asc, a.Col2 desc 

Results

| Col1 | Col2 | Col3 | 
|------|------|------| 
| A | 500 | ieb | 
| A | 400 | aem | 
| A | 300 | atd | 
| B | 550 | oui | 
| B | 450 | zir | 
| B | 350 | wmd | 
+0

有趣的是,我實際上閱讀了這篇[奇妙的文章]上完全相同的代碼(http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group -in-SQL /)。 雖然它工作正常,但我寧願避免它,因爲在獲取OP中概述的初始表結構之前,我必須做一些無關分組,這意味着由於連接,我必須執行相同的子查詢兩次。 –

+0

在審查@Amboom提供的替代方案後,您的解決方案似乎是最佳選擇。 –