mysql 中如何拿到每条数据最大值和最小值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 中如何拿到每条数据最大值和最小值相关的知识,希望对你有一定的参考价值。

参考技术A 两种方法:
1、
取排序最大值:
select * from order by time DESC LIMIT 0,1;
取排序最小值:
select * from user order by time ASC LIMIT 0,1;

2、借助php内置函数(看情况是否适合你的查询)
取排序最大值:
select MAX(字段)from user;
取排序最小值:
select MIN(字段)from user ;
延伸 limit的用法:
mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
5代表从第几个开始取,从0开始计数;10代表取几个记录;
//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.
//如果只给定一个参数,它表示返回最大的记录行数目:
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行
//换句话说,LIMIT n 等价于 LIMIT 0,n。

如何在 MySQL 中获取记录数以及最小值/最大值?

【中文标题】如何在 MySQL 中获取记录数以及最小值/最大值?【英文标题】:How to get number of records along with min/max values in MySQL? 【发布时间】:2012-08-23 07:17:55 【问题描述】:

我有一个搜索表单(运行 MySQL 5.0.88)来深入了解产品表。搜索是两步搜索。第一次运行得到number of results,第二次运行得到data of records x-y

我默认显示所有记录的最低/最高价格,现在想要根据查询结果更新最低/最高价格。我在想最好的方法是在初始查询中,获取记录数。

目前看起来是这样的:

SELECT  COUNT( a.id ) AS recordcount
        , a.nos
        , a.nos_anzeige

FROM artikelstammdaten a

WHERE 
        a.iln != "1111111111111" AND a.iln != "2222222222222" AND a.iln != "7777777777777"
    AND a.aktiv = "ja"
    AND a.artikelnummer LIKE '%name%' 
AND (a.modus = "OPEN" 
        OR a.iln IN ( 55555555555,66666666666,2222222222222 ) 
        )

GROUP BY a.iln, a.artikelnummer, a.preis_aktuell, a.artikelbezeichnung
HAVING (( sum(a.bestand) != 0 ) OR (a.nos = "ja" AND a.anzeige  = "ja" ))

这给了我所有匹配的记录。

问题: 实际上,我只想要一条记录中的记录数(~ query.recordcount )而不是一条一条的记录(我对 COUNT 的尝试不起作用)。像这样:

  totalrecords    min-price   max-price
  12345           9.99        1.204

我可以尝试在结果集中选择最小/最大值。

问题: 我如何修改我的查询,所以我只得到总记录(并且可以尝试添加最小/最大值)?

谢谢!

** 编辑:** 我的桌子是这样的:

 CREATE TABLE dummy (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`iln` VARCHAR(13) NULL DEFAULT NULL,
`ean` VARCHAR(35) NULL DEFAULT NULL,
`artikelnummer` VARCHAR(35) NULL DEFAULT NULL,
`preis_ek` DECIMAL(12,2) NULL DEFAULT NULL,
`preis_vk` DECIMAL(12,2) NULL DEFAULT NULL,
`firma` VARCHAR(35) NULL DEFAULT NULL,
`nos` VARCHAR(4) NULL DEFAULT NULL,
`nos_anzeige` VARCHAR(4) NULL DEFAULT NULL,
`aktiv` VARCHAR(4) NULL DEFAULT NULL,
`modus` VARCHAR(4) NULL DEFAULT NULL,
`bestand` DECIMAL(10,0) NULL DEFAULT '0'
 )  

价格将是 preis_ekpreis_vk,我正在寻找每个价格的最小值/最大值。谢谢!

编辑: 像这样运行查询会给我一个这样的结果集:

"id"    "nos"   "nos_anzeige"   "MIN(a.preis_ek)"
"1153837"   "nein"  "nein"  "25,10"
"1153797"   "nein"  "nein"  "12,40"
....

如果我没记错的话,它不会在结果集中选择每条记录的 min

【问题讨论】:

表的结构是什么,表中的价格列在哪里? @AnkurMittal 查看我的编辑 您可以在查询中使用 min 和 max 函数,例如。 SELECT max(id) FROM table 但是像这样的查询分别给了我每个匹配的记录,而不是带有记录计数的单个记录。 @frequent:当然是,你用的是GROUP BY 【参考方案1】:

你可以使用

    SELECT count(recordcount), 
       Max(max_price), 
       Min(min_price) 
       FROM   (SELECT Count(a.id)   AS recordcount, 
               a.nos, 
               a.nos_anzeige, 
               Max(preis_ek) AS max_price, 
               Min(preis_ek) AS min_price 
        FROM   artikelstammdaten a 
        WHERE  a.iln != "1111111111111" 
               AND a.iln != "2222222222222" 
               AND a.iln != "7777777777777" 
               AND a.aktiv = "ja" 
               AND a.artikelnummer LIKE '%name%' 
               AND ( a.modus = "open" 
                      OR a.iln IN ( 55555555555, 66666666666, 2222222222222 ) ) 
        GROUP  BY a.iln, 
                  a.artikelnummer, 
                  a.preis_aktuell, 
                  a.artikelbezeichnung 
        HAVING ( ( Sum(a.bestand) != 0 ) 
                  OR ( a.nos = "ja" 
                       AND a.anzeige = "ja" ) )) temp

【讨论】:

正确的轨道。如何修复every derived table must have it's own table name 一件事:将开头更改为:Count(recordcount), max(max_price), min(min_price) from (SELECT a.id AS recordcount... 否则我正在计算匹配 id 的总和,因此大小为 s、m、l、xl 的样式 123 将是 4 个 id,应该是算作 1 而不是 4...希望这很清楚 但您不是已经在内部查询中使用Count(a.id) AS recordcount,如果您想将每一行视为一条记录,那么您的建议是正确的,将进行更改:)

以上是关于mysql 中如何拿到每条数据最大值和最小值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中获取记录数以及最小值/最大值?

在 MySQL 中是不是可以找到最小值/最大值但首先删除异常值?

mysql 查询最大最小值和对应的时间

MySQL - 选择列表的平均值但忽略最大值和最小值

如何在SQL中查询最大值与最小值

mysql 判断最大值,最小值,第二大,第三大 一共四个值