Mysql 如何按条件每个组返回多行
我正试图根据条件得到给定组的前X个结果。 我目前使用的是这样的东西:Mysql 如何按条件每个组返回多行,mysql,sql,group-by,query-optimization,greatest-n-per-group,Mysql,Sql,Group By,Query Optimization,Greatest N Per Group,我正试图根据条件得到给定组的前X个结果。 我目前使用的是这样的东西: SELECT * FROM (SELECT id FROM myTable WHERE id IN (x1, x2, ..., xn) GROUP BY id ORDER BY grade DESC ) t1 INNER JOIN myTable t2 ON t2.id=t1.id id是一个非唯一的整型索引字段,每个
SELECT * FROM
(SELECT id
FROM myTable
WHERE id IN (x1, x2, ..., xn) GROUP BY id ORDER BY grade DESC
) t1
INNER JOIN myTable t2 ON t2.id=t1.id
id是一个非唯一的整型索引字段,每个值有多行
这将返回每个id的值,即具有最佳等级的行。如何将其转换为返回每个id的前X个结果
例如,对于以下数据
id grade
2 10
2 13
2 15
3 20
4 16
4 55
4 45
4 35
4 25
5 1
假设顶部X的X为2,我想得到以下行:
id grade
2 15
2 13
3 20
4 50
4 40
5 1
也许,像这样的
SELECT m.*
FROM (
SELECT id
FROM myTable
WHERE id IN (1, 3)
GROUP BY id
) AS ids
RIGHT JOIN myTable AS m ON ids.id = m.id
WHERE
m.id = ids.id AND
m.grade IN (
SELECT TOP 5 t.grade
FROM myTable AS t
WHERE t.id = ids.id
ORDER BY t.grade DESC
);
UPD:
甚至
这取决于你是否想退回领带 如果您想退回领带,可以使用以下方法:
CREATE TABLE grades (
id INT,
grade INT
);
INSERT INTO grades VALUES (1, 2);
INSERT INTO grades VALUES (1, 3);
INSERT INTO grades VALUES (1, 4);
INSERT INTO grades VALUES (1, 5);
INSERT INTO grades VALUES (2, 5);
INSERT INTO grades VALUES (2, 5);
INSERT INTO grades VALUES (2, 5);
INSERT INTO grades VALUES (2, 4);
INSERT INTO grades VALUES (3, 3);
INSERT INTO grades VALUES (3, 4);
INSERT INTO grades VALUES (4, 3);
SELECT id, grade
FROM grades g
WHERE (
SELECT COUNT(DISTINCT grade) FROM grades
WHERE id = g.id
AND grade >= g.grade
) <= 2;
输出:
ID GRADE
1 4
1 5
2 5
2 5
2 5
2 4
3 3
3 4
4 3
ID GRADE
1 4
1 5
2 5
2 4
3 3
3 4
4 3
如果不需要领带,请使用DISTINCT:
SELECT DISTINCT id, grade
FROM grades g
WHERE (
SELECT COUNT(DISTINCT grade) FROM grades
WHERE id = g.id
AND grade >= g.grade
) <= 2;
输出:
ID GRADE
1 4
1 5
2 5
2 5
2 5
2 4
3 3
3 4
4 3
ID GRADE
1 4
1 5
2 5
2 4
3 3
3 4
4 3
SQLFIDLE:顶部x结果来自哪个表?添加了一个示例,更加清晰?如果有15个id=2的结果怎么办?那你给我看3号好吗?如果打成平局怎么办?例如,对于一个给定的id,有3条记录具有相同的等级?@Przemyslaw Kruglej:如果在同一时刻有相同的想法,那么会发生什么-有没有办法避免子查询?将需要检查,但假设这将是性能杀手。这是为了在一个有数十亿行的表上运行。@Noam:为什么不将操作数据存储在一个单独的表碎片、分区中呢?@Noam你可以在你的问题中提到它。谷歌上有很多关于这个话题的文章,例如:或者