【问题标题】:Get the latest data by datetime fields from two tables从两个表中按日期时间字段获取最新数据
【发布时间】:2014-06-09 13:20:46
【问题描述】:

这个问题与我之前的问题略有不同:Get the latest data comparing datetime fields from two table

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

表:用户

+----+--------+--------------+----------------------+
| 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 |
|  8 | Bruce  |     bruce123 |  2014-06-04 15:07:11 |
+----+--------+--------------+----------------------+

表: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 |
|  7 | Dan    |       dan123 |  2014-06-04 15:09:46 |
+----+--------+--------------+----------------------+

现在我需要从这两个表中获取最新数据(通过“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 |
|  7 | Dan    |       dan123 |  2014-06-04 15:09:46 |
|  8 | Bruce  |     bruce123 |  2014-06-04 15:07:11 |
+----+--------+--------------+----------------------+

我现在拥有的:

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

但这只会获取两个表都可用的那些记录... 我还需要表中任何一个表中存在的数据。另外,我担心大量数据的查询性能。

这里是 sqlfiddle

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

【问题讨论】:

  • 期望的结果是什么样的,并且(虽然这完全取决于您)我希望您提供适当的 DDL 和/或 sqlfiddle - 没有不必要的列。
  • @Strawberry :我在我的问题中添加了一个示例 sqlfiddle... :)
  • 那么,您想要每个 id 的最新行吗?

标签: mysql join


【解决方案1】:
SELECT x.*
  FROM 
     ( SELECT * FROM user
       UNION ALL
       SELECT * FROM user_k
     ) x
  JOIN 
     ( SELECT id,MAX(lastupdatetime) max_lut
         FROM
            ( SELECT * FROM user
               UNION ALL
              SELECT * FROM user_k
            ) a
        GROUP
           BY id
     ) y
    ON y.id = x.id
   AND y.max_lut = x.lastupdatetime
 ORDER
    BY id;

http://sqlfiddle.com/#!2/05d8be/14

【讨论】:

    【解决方案2】:

    我有一个解决方案:

    SELECT * from 
    
    (SELECT u.*
    FROM user u LEFT OUTER JOIN user_k uk ON u.ID = uk.ID WHERE 
    (uk.ID IS NULL OR u.LastUpdateTime > uk.LastUpdateTime)
    
    UNION ALL
    
    SELECT uk.*
    FROM user_k uk LEFT OUTER JOIN user u ON u.ID = uk.ID WHERE 
    (u.ID IS NULL OR uk.LastUpdateTime >= u.LastUpdateTime)) usr
    
    order by usr.ID
    

    SQL FIDDLE

    【讨论】:

      猜你喜欢
      • 2014-07-27
      • 2021-11-19
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      • 2019-08-23
      相关资源
      最近更新 更多