Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何按条件每个组返回多行_Mysql_Sql_Group By_Query Optimization_Greatest N Per Group - Fatal编程技术网

Mysql 如何按条件每个组返回多行

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是一个非唯一的整型索引字段,每个

我正试图根据条件得到给定组的前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是一个非唯一的整型索引字段,每个值有多行

这将返回每个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你可以在你的问题中提到它。谷歌上有很多关于这个话题的文章,例如:或者