Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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_Min_Sql Limit - Fatal编程技术网

Mysql 在有限集合中查找最小值

Mysql 在有限集合中查找最小值,mysql,sql,min,sql-limit,Mysql,Sql,Min,Sql Limit,我需要从单列中有限的行数中找到一个最小值。假设我有这个结果表: 现在我需要创建一组>=50且限制为3行的值。像这样: ----------------------------------------- | id | category | class | score | ----------------------------------------- | 1 | contest1 | seven | 55 | | 2 | contest1 |

我需要从单列中有限的行数中找到一个最小值。假设我有这个结果表:

现在我需要创建一组>=50且限制为3行的值。像这样:

-----------------------------------------
|  id  |  category  |  class  |  score  |
-----------------------------------------
|   1  |  contest1  |  seven  |    55   |
|   2  |  contest1  |  sixth  |    78   |
|  10  |  contest1  |  nine   |    51   |
-----------------------------------------
在这个集合中,我必须找到最小值,这实际上非常简单,但前提是我手动为每个类别找到它。此查询非常有效:

SELECT MIN(t1.score) 
FROM (
SELECT category, score 
FROM results 
WHERE category = "contest1" AND score >= 50 
ORDER BY score DESC 
LIMIT 3
) t1
并给出正确的结果:

-------------------
|  MIN(t1.score)  |
-------------------
|        51       |
-------------------
但是,我不能为每个类别编写一个自动执行的查询。在一个真实的表格中,有上百个类别和数千个分数值。如何在一组有限的行中找到每个类别的最小值?

使用行号获取每个类别的前三行:

select r.*
from (select r.*, 
             row_number() over (partition by category order by sid) as seqnum
      from results r
      where score >= 50
     ) r
where seqnum <= 3;

您没有足够的行来产生影响

但它也使用rwo数字为每个类别获得3个大于50的最小分数


dbfiddle

谢谢你的回答。我恐怕这不是我的选择,因为我有MySQL 5.7。@sauromates。为什么您希望至少有三个任意行?为什么不使用总最低分数呢?因为每个类别的总最低分数都是50分,我需要在50到100分之间至少有25%的最高分数。
select r.*
from (select r.*, 
             row_number() over (partition by category order by sid) as seqnum
      from results r
      where score >= 50
     ) r
where seqnum <= 3;
select category, min(score)
from (select r.*, 
             row_number() over (partition by category order by sid) as seqnum
      from results r
      where score >= 50
     ) r
where seqnum <= 3
group by category;
CREATE TABLE results  (
  `id` INTEGER,
  `category` VARCHAR(8),
  `class` VARCHAR(6),
  `score` INTEGER
);

INSERT INTO results 
  (`id`, `category`, `class`, `score`)
VALUES
  ('1', 'contest1', 'seven', '55'),
  ('2', 'contest1', 'sixth', '78'),
  ('3', 'contest2', 'seven', '20'),
  ('4', 'contest1', 'eleven', '21'),
  ('5', 'contest2', 'eleven', '56'),
  ('6', 'contest3', 'ten', '66'),
  ('7', 'contest3', 'ten', '90'),
  ('8', 'contest3', 'nine', '91'),
  ('9', 'contest2', 'seven', '30'),
  ('10', 'contest1', 'nine', '51');
SELECT
`id`, `category`, `class`, `score` 
FROM(SELECT 
IF(`category` = @cat,@rown := @rown + 1 ,@rown := 1) rownum
,`id`
, @cat := `category` 'category'
, `class`
, `score` 
FROM (SELECT * FROM results ORDER By `category`, `score` )r1,(SELECT @rown := 0, @cat := '') t1
WHERE `score` > 50 ) t1
WHERE rownum < 4
id | category | class | score -: | :------- | :----- | ----: 10 | contest1 | nine | 51 1 | contest1 | seven | 55 2 | contest1 | sixth | 78 5 | contest2 | eleven | 56 6 | contest3 | ten | 66 7 | contest3 | ten | 90 8 | contest3 | nine | 91