【问题标题】:Latest date for each id, in a union table联合表中每个 id 的最新日期
【发布时间】:2015-03-01 13:51:12
【问题描述】:

我有一个数据库,其中包含工人和他们可以完成的三项不同任务。每个任务表都包含执行此任务的工作人员、执行任务的时间和时间。

所以表格如下所示:

工作表:

-------------------------
|worker_id | worker_name|
|----------|------------|
|          |            |

任务表:

------------------------------------
|task_id | worker_id | date | time |
|--------|-----------|------|------|
|        |           |      |      |

每个任务表如上所示,分别称为 task1、task2、task3。不可能将它们放在同一个表中,因为每个任务都有其他特定于自身的列,这些列不是此联合所必需的,而是在其他地方使用的。

要使用的三个任务表的并集如下:

SELECT `date`, time FROM task1
UNION ALL SELECT `date`, time FROM task2
UNION ALL SELECT `date`, time FROM task3

如何使用上述联合编写一个 select 语句来返回每个工人的 ID 和姓名,以及他们最近任务的日期和时间长度。

我尝试使用从以下问题中选择的答案,但将 wp_posts 表替换为三个任务表的并集,但没有成功: MySQL order by before group by

【问题讨论】:

  • 我仍然有一个核心任务表。
  • 您将如何处理具有不同其他列的不同任务?
  • 按照您的建议将附件数据放在单独的表中,但只将公共数据存储在一个地方

标签: mysql union union-all


【解决方案1】:

我要推荐substring_index()/group_concat()技巧:

SELECT userid, max(date) as date,
       substring_index(group_concat(time order by date desc), ',', 1) as time
FROM (SELECT userid, `date`, time FROM task1 UNION ALL
      SELECT userid, `date`, time FROM task2 UNION ALL
      SELECT userid, `date`, time FROM task3
     ) u
GROUP BY userid;

这会将time 转换为字符串。如果您希望以特定格式使用date_format(),则可能需要使用它。

【讨论】:

  • 现货 - 似乎也提供了比链接问题更简单的解决方案!
  • UNION 中的 SELECT 没有相同数量的字段。在第 2 和第 3 的开头添加用户 ID。
  • @RickJames。 . .谢谢。
猜你喜欢
  • 2018-04-16
  • 2016-12-18
  • 2021-08-27
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 2021-05-08
  • 1970-01-01
相关资源
最近更新 更多