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 列的每个值一个查询的情况下实现这样的行为?
试试这个;)
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
| 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
有人知道如何克服这个问题吗?
有没有办法根据 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 列的每个值一个查询的情况下实现这样的行为?
试试这个;)
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
| 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
有人知道如何克服这个问题吗?