MySQL ORDER由两列组成,限制在一个列上

时间:2016-05-25 00:56:05

标签: mysql sql-order-by sql-limit

有没有办法根据A列和B列对MySQL进行ORDER结果,然后将结果限制为每A的值为X,如ORDER BY A, (B LIMIT X)

假设我有以下格式的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列的每个值一个查询,我怎么能实现这样的行为?

2 个答案:

答案 0 :(得分: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 |

答案 1 :(得分:0)

如果在第2列中没有重复项,则@Blank回答的上述解决方案似乎是最佳的

如果架构如下所示:

创建表table_A ({Col1 varchar(1),Col2 int,Col3 varchar(3)) ;

INSERT INTO table_A (Col1Col2Col3) 价值 ('A',100,'abc'), ('A',200,'tyu'), ('A',200,'acd'), ('A',300,'okp'), (“ A”,300,“ atd”), ('A',400,'aem'), ('A',500,'ieb'), (“ B”,150,“ aio”), ('B',250,'loe'), (“ B”,350,“ wmd”), ('B',450,'zir'), (“ B”,550,“ oui”) ;

那么结果是:

col1 col2 col3

A | 500 |伊伯 A | 400 | Aem B | 550 | i B | 450 |齐尔 B | 350 | wmd

它将跳过两个A 300。

请参见:http://sqlfiddle.com/#!9/454702/1/0

有人提示任何人如何克服这个问题吗?