MYSQL - 在子查询中是否有 LIMIT 的替代方案?

标签 mysql sql subquery

我正在使用MYSQL。我有下表:

create table visit (
   id int,
   seller_number varchar(10),
   date_visit date,
   city_visited varchar(50),
   status varchar(50)
);

此表的示例数据:

id   seller_number  date_visit    city_visited      status

10   11111          2005-02-12    Goiania/GO        Yes
11   11111          2010-05-19    Marilia/SP        Sim
12   11111          2015-01-23    Brasilia/DF       No
13   22222          2014-01-02    Brasilia/DF       Yes
14   22222          2012-10-21    Goiania/GO        No
15   33333          2010-08-09    Marilia/SP        No

我需要一个SQL,它仅返回每个卖家最新日期的行,如下所示:

id   seller_number  date_visit    city_visited      status

12   11111          2015-01-23    Brasilia/DF       No
13   22222          2014-01-02    Brasilia/DF       Yes
15   33333          2010-08-09    Marilia/SP        No

我使用子查询执行此操作,但MYSQL不接受LIMIT:

SELECT seller_number, date_visit, city_visited, status FROM visit WHERE (seller_number, date_visit) IN (SELECT seller_number, MAX(date_visit) FROM visit GROUP BY seller_number LIMIT 500);

没有LIMIT它可以工作,但是我需要限制它,因为表有超过3000万个元组,并且无法查询。

是否有其他替代方法可以在子查询中不使用 LIMIT 的情况下获得此结果?

谢谢

最佳答案

您可以使用存在量词和相关子查询,而不是显式选择最大日期:

SELECT
    v.seller_number
,   v.date_visit
,   v.city_visited
,   v.status
FROM visit v
WHERE NOT EXISTS (
    SELECT *
    FROM visit otherVisit
    WHERE v.seller_number=otherVisit.seller_number
      AND otherVisit.date_visit > v.date_visit
);

关于MYSQL - 在子查询中是否有 LIMIT 的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50109323/

相关文章:

c# - 如何使用 DateTime.Now.ToString();在 sql 命令中,无需删除斜杠

php - MySQL 搜索不存在的 URL 并从数据库中删除

mysql - 通过将以下查询合并为一个来加速它们

mysql - 再次出现行时间差异

mysql - 复合类(class)先决条件(a、b、c 和 x 或 y 以及 z 样式中的一个或多个)

mysql - SQL子查询帮助(我相信使用聚合函数)

mysql - 不用 sudo 连接到本地 MySQL 服务器

sql - 将 SQL 重写为 JOINS 而不是子查询

MySQL 子选择多个条件

javascript - WordPress Jquery MySQL 插件