MySQL 按两列排序,限制在一列

MySQL ORDER by two columns, limit on a single one

有没有办法根据 A 列和 B 列对 MySQL 中的结果进行排序,然后将结果限制为每个 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 列的每个值一个查询的情况下实现这样的行为?

试试这个;)

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 |

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

如果架构如下所示:

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

插入 table_A (Col1, Col2, Col3) 价值观 ('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

一个 | 500 | ieb 一个| 400 |艾姆 乙 | 550 | oui 乙 | 450 |锆 乙 | 350 | wmd

它将跳过两个 A 300。

查看:http://sqlfiddle.com/#!9/454702/1/0

有人知道如何克服这个问题吗?