【问题标题】:mysql join where the difference between values is minimal?mysql join 值之间差异最小的地方?
【发布时间】:2012-06-15 02:32:10
【问题描述】:

原则上我有 2 个表 T1 和 T2,每个表都包含一个日期字段,我们称之为日期:

T1: date | somekey  | data ... 
T2: date | somekey  | data ...

我想(left)join T1 and T2,这样结果就会包含 T1 中的所有行。

现在,对于 T1 中的每一行,我需要 T2 的(恰好一个)行中的值,其中 ABS(DATEDIFF(T1.date,T2.date)) 最小且 T1.somekey=T2.somekey (如果 T2 中没有这样的行,则为 null)

【问题讨论】:

  • “最小差异”是什么意思
  • 据我所知 DATEDIFF 产生一个整数值,表示两个日期之间的天数差。如果 T2 中有与条件匹配的行,则必须有一个特定行的差异最小。抱歉,我无法更清楚地表达这一点。

标签: mysql join left-join minimum


【解决方案1】:

不要在JOIN子句中做,直接放在WHERE子句中。

SELECT
*
FROM
T1
LEFT JOIN T2 ON T1.somekey = T2.somekey
WHERE
ABS(DATEDIFF(T1.date,T2.date)) = 1 /*or whatever "minimal" means for you*/
/*or like this:*/                < $yourMinimalValue

编辑:

我想我得到了你想要做的,但是子查询是去这里的方式:

SELECT
*
FROM
T1
LEFT JOIN T2 ON T1.somekey = T2.somekey
WHERE
ABS(DATEDIFF(T1.date,T2.date)) = (SELECT MIN(DATEDIFF(TT1.date, TT2.date)) FROM  T1 AS TT1 LEFT JOIN T2 AS TT2 ON TT1.somekey = TT2.somekey)

【讨论】:

  • 这就是问题所在:minimal 不是一个常数值。
  • @IARI 那么您要选择 DATEDIFF 最小的行吗?我仍然不完全清楚您要完成什么。
  • @akalucas 我认为这就是他想要的,是的。
  • @tombom 是的,这正是我想要的。此外,如果子查询不在 from 子句中,也可以。我认为您可以从帖子中删除第一个建议,第二个是有趣的案例。
猜你喜欢
  • 2013-08-07
  • 1970-01-01
  • 2012-10-09
  • 2015-11-12
  • 2013-04-03
  • 2017-03-04
  • 2020-04-30
  • 2016-06-19
  • 1970-01-01
相关资源
最近更新 更多