mysql - 显示 WHERE IN 子句 SQL 中每条记录的最大日期

标签 mysql sql phpmyadmin

使用 MySQL,我有一个名为 subscriptions 的表,如下所示

name,   renewal_date,    national_id
---------------------------------------
ted,     1/2/2010,        A1111R
ben,     1/3/2010,        A145E1
bob,      8/4/2009,       A11C11
kate,     2/2/2010,       A111E1
ted,     12/2/2011,       A1111R
bob,     12/2/2014,       A11C11
ben,     12/2/2016,       A145E1

etc..

该表大约有 150000 条记录。每个人可以有多个订阅。我想显示给我查询的列表中每条记录的最大/最新renewal_date。这是我的sql语句:

select d.name, d.renewal_date, d.national_id
from subscriptions d
where renewal_date= (select max(d1.renewal_date) 
                     from subscriptions d1 
                     where d1.national_id = d.national_id IN ('A1111R','A11C11', 'A145E1' ....));

当我在 phpmyadmin 中运行查询时,即使 IN 子句中的记录很少,它似乎也没有结束执行。

最好的方法是什么?我还应该说我还不是 SQL 专家 :-) 提前致谢

最佳答案

假设给定人员的姓名和国民 ID 没有改变,您可以只使用聚合:

select d.name, max(d.renewal_date), d.national_id
from subscriptions d
where d.national_id in ( . . . )
group by d.name, d.national_id;

如果您想要行上的所有列,最有效的方法通常是具有正确索引的相关子查询:

select s.*
from subscriptions s
where s.national_id in ( . . . ) and
      s.renewal_date = (select max(s2.renewal_date)
                        from subscriptions s2
                        where s2.national_id = s.nation_id
                       );

正确的索引是(national_id,renew_date)。实际上,在许多情况下,这可能比 group by 查询更快。

关于mysql - 显示 WHERE IN 子句 SQL 中每条记录的最大日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58779320/

相关文章:

mysql - 将 autoincrement id 字段加一

sql - Long Integer 可以存储字母吗?

mysql - 处理重复项而不从数据库中删除它们

MySQL 5.1/phpMyAdmin - 记录 CREATE/ALTER 语句

mysql - 有限制的子查询

php - 如何相邻显示数据库中的列表项?

mysql - 在magento模块中创建表

python - 通过 Python 将输入加载到 MySQL 表失败,列长度错误

php - 自动将 SQL 表内容发送到电子邮件地址

mysql - 用破折号替换空格并复制到新列中