【问题标题】:SQL - Retrieving results from 3 tables and ordering them by dateSQL - 从 3 个表中检索结果并按日期排序
【发布时间】:2018-08-03 11:16:24
【问题描述】:

假设我有这三个表:

╔═══╦════════════╦═════════════════════╗
║   ║ Name       ║ Date                ║
╠═══╬════════════╬═════════════════════╣
║ 1 ║ Bob        ║ 2018-07-30 14:20:03 ║
║ 2 ║ Dylan      ║ 2018-07-29 14:20:03 ║
║ 3 ║ Frank      ║ 2018-07-17 14:20:03 ║
╚═══╩════════════╩═════════════════════╝

╔═══╦════════════╦═════════════════════╗
║   ║ Name       ║ Date                ║
╠═══╬════════════╬═════════════════════╣
║ 1 ║ Bernard    ║ 2018-07-31 14:20:03 ║
║ 2 ║ Max        ║ 2018-07-28 14:20:03 ║
║ 3 ║ Dan        ║ 2018-07-16 14:20:03 ║
╚═══╩════════════╩═════════════════════╝

╔═══╦════════════╦═════════════════════╗
║   ║ Name       ║ Date                ║
╠═══╬════════════╬═════════════════════╣
║ 1 ║ Maria      ║ 2018-07-12 14:18:03 ║
║ 2 ║ Sofia      ║ 2018-07-30 14:23:03 ║
║ 3 ║ Lila       ║ 2018-07-25 14:22:03 ║
╚═══╩════════════╩═════════════════════╝

我想知道如何选择前 3 个元素,按日期排序(从现在开始最接近的日期),以便最后我的查询结果如下所示:

╔═══╦════════════╦═════════════════════╗
║   ║ Name       ║ Date                ║
╠═══╬════════════╬═════════════════════╣
║ 1 ║ Bernard    ║ 2018-07-31 14:20:03 ║
║ 2 ║ Sofia      ║ 2018-07-30 14:23:03 ║
║ 3 ║ Bob        ║ 2018-07-30 14:20:03 ║
╚═══╩════════════╩═════════════════════╝

干杯!

【问题讨论】:

  • 你使用的是 MySQL 还是 SQLite...它们不是一回事。
  • 我都在使用。 SQLite 在本地进行测试,准备就绪后在服务器上测试 MySQL。
  • 请注意,此类问题可能是架构设计不当的症状。
  • 这是什么意思?

标签: mysql sql sqlite


【解决方案1】:
SELECT *
FROM
(
    SELECT * FROM Table1
    UNION ALL
    SELECT * FROM Table2
    UNION ALL
    SELECT * FROM table3
) tmp
ORDER BY DATE DESC
LIMIT 3;

【讨论】:

  • MySQL 或 SQLite 都不支持TOP 关键字;他们改用LIMIT
【解决方案2】:

你需要 union allrow_number()

select t.*
from ( select *, row_number() over (partition by tablename order by date desc) seq
       from ( (select name, date, 'table1' as tablename
               from table1 t1
              ) union all
              (select name, date, 'table2'
               from table2 t2
              ) union all
              (select name, date, 'table3'
               from table3 t3
              )
           ) t
     ) t
where seq = 1;

【讨论】:

  • 包含 tablename 列无需 ALL 关键字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多