【问题标题】:Get row with the minimum date from a joined table but don't show this date?从联接表中获取具有最短日期的行但不显示此日期?
【发布时间】:2014-11-28 19:57:01
【问题描述】:

这是我的查询的一部分:

SELECT
    my1.data AS PAW_ID,
    abc.abc_medium AS abc_Medium,
    my.data AS Trial_Date,
    my2.data AS Upgrade_Date,
    my3.lastmod AS Cancel_Date

中间有几个连接。结果集给出了PAW_ID 的多个实例,而我只想要一个。我知道当查询加入另一个表abc_emails.def208时,那么最早def208.created行存在的记录就是我需要的行。

所以如果上面的查询产生了以下重复数据:

123 | email | 1-1-2014 | 2-1-2014 | 3-1-2014
123 | banner| 4-1-2014 | 2-1-2014 | 3-1-2014

我知道这个PAW_ID (123) 对应于abc_emails.def208 中的数据,其中MIN(def208.created) 应该返回包含电子邮件的行。

def208.created 不在查询的SELECT 部分中,但我确实想利用它。如何选择此值并按其他所有内容分组,但将其隐藏?唯一需要做的是获取每个PAW_ID 的最早关联数据点。

【问题讨论】:

  • 您可以发布其余的查询或表结构吗?
  • 你的意思是WHERE <one of your dates> = (SELECT MIN(created) FROM def208)
  • 请注意,SQL 中的日期遵循特定格式。

标签: mysql sql select join


【解决方案1】:

我相信您可以使用子查询来完成此操作。您可以创建一个具有 PAW_ID 和最短日期的表,并将其与 PAW_ID 和日期匹配的其他表连接起来,这样就可以消除您不想要的行。在不知道您的表结构的情况下,很难给出确切的查询,但我想您可以这样做:

SELECT columnsIWant
FROM tables
JOIN otherTables ON conditions
JOIN (SELECT paw_id, MIN(created) AS minDate
      FROM def208
      GROUP BY paw_id) tempTable
   ON tempTable.paw_id = realTable.paw_id AND tempTable.minDate = realTable.created;

只要您没有SELECT tempTable.minDate,它就不会出现在您的结果集中。

编辑

另一种不使用另一个 JOIN 的方法是尝试将它放在你的 where 子句中,如下所示:

SELECT columnsIWant
FROM tables 
JOIN otherTables ON conditions
WHERE realDef208.created = (SELECT MIN(created) FROM tempDef208 WHERE tempDef208.paw_id = realDef208.paw_id);

【讨论】:

  • 我必须在出发前取消查询。如果我因为过去发生的事件而在我们的服务器上运行查询,我们的 sr 开发人员会感到不安。我将在星期一上午再次开始运行它。很抱歉让你挂了,我很感激这个答案,一旦它最终运行就会更新。
  • @DougFirr 必须是大型数据集。好吧,我希望它对你有用。
  • @DougFirr 刚刚签到,因为我对这个真的很好奇。如果您还没有运行它,请忽略它。或者如果它不起作用,请告诉我,我可以再次查看。
  • 它正在运行!我希望它满载而归。似乎我们的服务器很难处理子查询。
  • @DougFirr 如果您没有运气,我会想到另一个选项,但我不确定它是否会比第一个更好。我也不能保证不会更糟。我不是效率专家。
【解决方案2】:

创建一个从当前数据中选择 Distinct(paw_id) 和 Min(created) 的视图,并在 id 和日期上将视图与您的普通表连接起来,这将隔离您正在查找的行而无需选择不需要的日期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 2015-11-27
    • 2015-02-25
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多