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

Mysql 从表中获取第二高的值

Mysql 从表中获取第二高的值,mysql,sql,Mysql,Sql,我有一张这样的桌子: +----+---------+------------+ | id | conn_id | read_date | +----+---------+------------+ | 1 | 1 | 2010-02-21 | | 2 | 1 | 2011-02-21 | | 3 | 2 | 2011-02-21 | | 4 | 2 | 2013-02-21 | | 5 | 2 | 2014-02-21 |

我有一张这样的桌子:

+----+---------+------------+
| id | conn_id | read_date  |
+----+---------+------------+
|  1 |       1 | 2010-02-21 |
|  2 |       1 | 2011-02-21 |
|  3 |       2 | 2011-02-21 |
|  4 |       2 | 2013-02-21 |
|  5 |       2 | 2014-02-21 |
+----+---------+------------+

我需要特定“连接id”的第二高读取日期,即我需要一个连接id上的分组。请帮助我解决此问题。

以下是特定连接id的解决方案:


以下答案应适用于MSSQL:

select id,conn_id,read_date  from (
select *,ROW_NUMBER() over(Partition by conn_id order by read_date desc) as RN 
from my_table
)
where RN =2

这里有一篇关于MySQL中rank函数使用的有趣文章:

如果您的表设计为ID-日期匹配,即大ID总是大日期,您可以按ID分组,否则请执行以下操作:

$sql_max = '(select conn_id, max(read_date) max_date from tab group by 1) as tab_max';

$sql_max2 = "(select tab.conn_id,max(tab.read_date) max_date2 from tab, $sql_max
where tab.conn_id = tab_max.conn_id and tab.read_date < tab_max.max_date 
group by 1) as tab_max2";

$sql = "select tab.* from tab, $sql_max2 
where tab.conn_id = tab_max2.conn_id and tab.read_date = tab_max2.max_date2";

谢谢您的回答,但是您不能针对一般情况修改它吗?它应该为所有唯一的“连接id”打印第二高的“读取日期”。但是您能告诉我为什么这个查询是从my_表中选择*,maxread_date为prev,其中读取日期有两个相同的最大值时,您想做什么?
select id,conn_id,read_date  from (
select *,ROW_NUMBER() over(Partition by conn_id order by read_date desc) as RN 
from my_table
)
where RN =2
$sql_max = '(select conn_id, max(read_date) max_date from tab group by 1) as tab_max';

$sql_max2 = "(select tab.conn_id,max(tab.read_date) max_date2 from tab, $sql_max
where tab.conn_id = tab_max.conn_id and tab.read_date < tab_max.max_date 
group by 1) as tab_max2";

$sql = "select tab.* from tab, $sql_max2 
where tab.conn_id = tab_max2.conn_id and tab.read_date = tab_max2.max_date2";