【问题标题】:Get MAX inputted date within sub query在子查询中获取最大输入日期
【发布时间】:2018-10-18 06:10:03
【问题描述】:

我有一个正在运行但不符合要求的脚本。我的目标是为account_manager_sellers 列表中的每个卖家选择plans 数据库中最近输入的记录。

以下脚本的当前问题是:它返回的是最旧的记录而不是最新的记录,例如:它选择的是 2016 年的记录,而不是时间戳为 2018 年的记录。(最终我需要更改WHERE 子句获取 2017-01-01 之前的所有 lastsale 记录。

简单的数据库示例。

plansAKA(销售名单)

+----+------------------+-----------+
| id |   plan_written   | seller_id |
+----+------------------+-----------+
|  1 | 20/09/2016 09:12 |       123 |
|  2 | 22/12/2016 09:45 |       444 |
|  3 | 19/10/2016 09:07 |       555 |
|  4 | 02/10/2015 14:26 |       123 |
|  5 | 15/08/2016 11:06 |       444 |
|  6 | 16/08/2016 11:03 |       123 |
|  7 | 03/10/2016 10:15 |       555 |
|  8 | 28/09/2016 10:12 |       123 |
|  9 | 27/09/2016 15:12 |       444 |
+----+------------------+-----------+

account_manager_sellers(卖家名单)

+-----+----------+
| id  |   name   |
+-----+----------+
| 123 | person 1 |
| 444 | person 2 |
| 555 | person 3 |
+-----+----------+

当前使用的代码

SELECT p.plan_written, p.seller_id
FROM plans AS p NATURAL JOIN (
         SELECT   id, MAX(plan_written) AS lastsale
         FROM     plans
         GROUP BY seller_id
       ) AS t
JOIN account_manager_sellers AS a ON a.id = p.seller_id
WHERE  lastsale < "2018-05-08 00:00:00"

总结

使用上面的代码和示例表,此代码将返回这 3 个结果,虽然我们确实期望 3 个结果,但似乎没有跟随 MAX(plan_written),我的猜测是它与GROUP 子句,我不确定我们是否可以使用 ORDER BY 和 LIMIT 子句?

+--------------+------------------+
| seller_id    |   plan_written   |
+--------------+------------------+
|          123 | 16/08/2016 11:03 |
|          444 | 15/08/2016 11:06 |
|          555 | 03/10/2016 10:15 |
+--------------+------------------+

【问题讨论】:

  • 如果只有两个表,为什么要进行两个连接?这不是一种有效的方法。 IMO 你应该从已经加入的表中选择 id 和 max date。

标签: mysql join subquery


【解决方案1】:

您的查询中的加入条件已关闭,您应该限制每个卖家的最大日期。此外,您无需加入 account_manager_sellers 表即可获得预期的输出:

SELECT p1.*
FROM plans p1
INNER JOIN
(
    SELECT
        seller_id, MAX(plan_written) AS max_plan_written
    FROM plans
    WHERE plan_written < '2018-05-08 00:00:00'
    GROUP BY seller_id
) p2
    ON p1.seller_id = p2.seller_id AND
       p1.plan_written = p2.max_plan_written;

【讨论】:

  • 我没有存储为文本,抱歉,这是 excel 格式化我的示例,它是一个正确的时间戳。
  • 完美,非常感谢,现在断断续续地使用了几天,这很有效,我不知道为什么其他解决方案不起作用,可能是因为它是 INNER 而不是自然加入IDK,但经过一些测试后它可以工作,再次感谢。
  • @PeterBennett 我没有评论自然连接(有些人喜欢它,有些人讨厌它),但在这种情况下,它肯定不会更容易理解连接条件。但是您更大的问题是没有将外部表限制为最大日期,并且对计划写入日期的检查需要在子查询内。
  • 哦,我想加入 account_manager_sellers 的唯一原因是我可以将他们的电子邮件附加到结果中,但我相信我可以解决这个问题。
猜你喜欢
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多