【问题标题】:Get the latest data comparing datetime fields from two tables从两个表中获取比较日期时间字段的最新数据
【发布时间】:2014-07-27 11:16:36
【问题描述】:

我有两个结构相同的表,如下所示:

表:用户

+----+--------+--------------+----------------------+
| ID | Name   |    Password  |    LastUpdateTime    |
+----+--------+--------------+----------------------+
|  1 | abu    |    abu123NEW |  2014-06-04 14:55:06 |
|  2 | john   |      john123 |  2014-06-04 14:58:22 |
|  3 | shane  |     shane123 |  2014-06-04 15:02:06 |
|  4 | marie  |     marie123 |  2014-06-04 15:00:06 |
|  5 | mike   |   mike123NEW |  2014-06-04 15:01:32 |
|  6 | kiron  |  kiron123NEW |  2014-06-04 15:05:46 |
+----+--------+--------------+----------------------+

表:user_k

+----+--------+--------------+----------------------+
| ID | Name   |    Password  |    LastUpdateTime    |
+----+--------+--------------+----------------------+
|  1 | abu    |       abu123 |  2014-06-04 14:53:06 |
|  2 | john   |   john123NEW |  2014-06-04 14:59:48 |
|  3 | shane  |  shane123NEW |  2014-06-04 15:00:06 |
|  4 | marie  |  marie123NEW |  2014-06-04 15:03:17 |
|  5 | mike   |      mike123 |  2014-06-04 15:00:36 |
|  6 | kiron  |     kiron123 |  2014-06-04 15:02:18 |
+----+--------+--------------+----------------------+

现在我需要从这两个表中获取最新数据(通过“LastUpdateTime”),如下所示:

+----+--------+--------------+----------------------+
| ID | Name   |    Password  |    LastUpdateTime    |
+----+--------+--------------+----------------------+
|  1 | abu    |    abu123NEW |  2014-06-04 14:55:06 |
|  2 | john   |   john123NEW |  2014-06-04 14:59:48 |
|  3 | shane  |     shane123 |  2014-06-04 15:02:06 |
|  4 | marie  |  marie123NEW |  2014-06-04 15:03:17 |
|  5 | mike   |   mike123NEW |  2014-06-04 15:01:32 |
|  6 | kiron  |  kiron123NEW |  2014-06-04 15:05:46 |
+----+--------+--------------+----------------------+

我尝试过的:

SELECT uk.* FROM user AS ua, user_k AS uk
WHERE  uk.ID = ua.ID AND uk.LastUpdateTime > ua.LastUpdateTime

UNION

SELECT ua.* FROM user AS ua ,user_k AS uk
WHERE  uk.ID = ua.ID AND uk.LastUpdateTime < ua.LastUpdateTime

我不确定这是否合适。此外,我担心大量数据的查询性能。有没有更好的方法呢?

PS除了名称和密码之外,两个表中还有十几个字段(列)。我避免使用它们只是为了简化问题。

【问题讨论】:

  • 您需要在两个表之间优化UNION,但按LastUpdateTime 排序?
  • @Kabulan0lak.. 是的,我需要最新数据,但不确定 UNION 在这种情况下是否是最好的..
  • 为什么不呢?我认为在这种情况下使用UNION ALL 会既快速又干净。
  • 哦,抱歉,我没有意识到这两个表中的用户是相同的。因此,UNION 非常错误,是的。

标签: mysql join


【解决方案1】:
select
u.id,
u.name,
if(u.LastUpdateTime >= k.LastUpdateTime, u.password, k.password) as password,
greatest(u.LastUpdateTime, k.LastUpdateTime) as LastUpdateTime
from
user u
inner join user_k k on u.id = k.id

P.S.:对于 id 3,较新的密码实际上是来自用户表的密码,而不是 user_k。您想要的结果集需要此调整。

【讨论】:

  • 不行,这不会按照用户规定返回正确的密码。
  • @astander 已更正。谢谢。
  • @fancyPants 感谢您的回答.. :) 但是,除了名称和密码之外,两个表中还有十几个列。所以我必须对每列进行if() 比较。 .?另外,与我在问题中提到的UNION 方法相比,性能如何......?
  • 是的,您必须对每一列进行 if() 比较。我绝对肯定,UNION 的性能会差很多。
猜你喜欢
  • 1970-01-01
  • 2010-11-06
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多