【问题标题】:WHERE fieldname IS MIN(somedate) Is there a way to write this without using a subquery?WHERE fieldname IS MIN(somedate) 有没有办法在不使用子查询的情况下编写它?
【发布时间】:2014-12-04 02:19:30
【问题描述】:

我们的服务器很难运行此查询。我希望有人可以通过建议一种重写方法来帮助我,以便在没有子查询的情况下获得相同的结果。

子查询的目的是在 where 子句中使用 min:我只想返回带有最早的 co.created 日期的结果。

所以我希望我能做的是:

SELECT 
        my.data AS Account_ID,
        co.ID AS User_ID,
        def.def_medium,
        co.created
FROM (tables with associated joins)
WHERE MIN(co.created)

但我不能这样做,所以我想出了这个:

SELECT 
    my.data AS Account_ID,
    co.ID AS User_ID,
    def.def_medium,
    co.created
FROM
    abc_emails.cid208 co
INNER JOIN abc_emails.def208 def ON def.eid = co.id
INNER JOIN abc_emails.my208 my ON my.eid = co.id AND my.my_id = 2765
INNER JOIN (SELECT 
                my.data AS Account_ID,
                MIN(created) AS created
            FROM 
                abc_emails.my208 my
            INNER JOIN abc_emails.cid208 co ON co.id = my.eid
                WHERE my_id = 2765
            GROUP BY Account_ID
            ) b1 ON b1.Account_ID = my.data
GROUP BY Account_ID, User_ID, def_medium

但它已经运行了很长时间,并且根据我在这台服务器上的经验,我即将被启动并显示一条错误消息,告诉我它已超时。

是否可以在没有子查询的情况下做我正在做的事情?

【问题讨论】:

  • ?但这并不是真正的查询
  • @Strawberry 怎么样?您是指顶部的“查询”吗?那是我只是想写得更少,更直截了当。我的目标是重写大​​查询减去必须使用 b1
  • 除非 MySQL 中有 OLAP 函数(RANK 等),否则需要显式的子查询。使用 OLAP 函数,您可能会做得更流畅。
  • 其他人可能会有不同的感觉,但如果我看不到实际的查询(以及更多),那么在大多数情况下我无能为力。因此,如果您愿意,请考虑遵循这个简单的两步操作: 1. 如果您还没有这样做,请提供适当的 DDL(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。

标签: mysql


【解决方案1】:

您要使用的查询:

SELECT 
        my.data AS Account_ID,
        co.ID AS User_ID,
        def.def_medium,
        co.created
FROM (tables with associated joins)
WHERE MIN(co.created)

实际上并不是一个查询。大声朗读给自己听。 “我要这个数据,最小日期在哪里……”。这是一个不完整的想法。您必须在 WHERE 子句中指定要完成的任务。它应该是“我想要这个数据,其中 co 表的最小日期是”

例如:

SELECT 
        my.data AS Account_ID,
        co.ID AS User_ID,
        def.def_medium,
        co.created
FROM (tables with associated joins)
WHERE my.date > MIN(co.created)

如果您只想要最旧的项目,并且要知道它们的 Account_id、User_Id、def_medium,您可以简单地按创建日期升序排列列表并获取您想要的结果数。

SELECT  my.data AS Account_ID,
        co.ID AS User_ID,
        def.def_medium,
        co.created
FROM (tables with associated joins)
ORDER BY co.created ASC
LIMIT NumberOfResults

您正在尝试查找最早的 account_ID。如果您有 10 行,所有行都具有相同的 ID,您希望找到具有 MIN(co.created) 的行。这相当于 MSSQL row_number 分区:stackoverflow.com/questions/1895110/row-number-in-mysql

【讨论】:

  • 唉!当我看到“Top”时,我很兴奋。但不,似乎不是 MySQL 函数
  • 对不起,我在做自己的项目,然后回到这里,不小心写了 MSSQL 而不是 MySQL。当我被否决时,我正在编辑它:/
  • 好的,但是有没有办法在 GROUP BY 级别而不是整个查询中应用 LIMIT?
  • 我想我终于知道你想要什么了。您正在尝试查找最旧的 account_ID。如果您有 10 行,所有行都具有相同的 ID,您希望找到具有 MIN(co.created) 的行。让我知道这是否有帮助:stackoverflow.com/questions/1895110/row-number-in-mysql
  • 感谢您指出这一点,这确实有所帮助。我选择了 NULL Self Left Join
猜你喜欢
  • 1970-01-01
  • 2011-12-07
  • 2014-11-29
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多