【问题标题】:How can I get a history like query on MySQL?如何在 MySQL 上获得类似查询的历史记录?
【发布时间】:2014-09-08 22:39:00
【问题描述】:

在这里我需要一点帮助。

我正在 MySQL 中构建一个数据库,我将在其中进行许多不同的活动。每个活动都是列表的一部分。

所以,我的数据库中有以下表格。

列表

  • 身份证
  • 姓名

活动

  • 身份证
  • 姓名
  • idList(FK 到列表)

我还想知道每个活动何时完成(您可以多次完成相同的活动)。为此,我还有一张桌子:

历史

  • 日期
  • idActivity(FK 到活动)

当用户完成一项活动时,我将此活动的 ID 和活动完成的当前时间添加到历史记录表中。

我想获取包含完成日期的整个列表。当活动尚未完成时,我希望它显示日期为空。

但是,只获取一次列表很容易。一个简单的左外连接就可以解决问题。我的问题是,每次历史记录表上出现日期时,我都想获取整个列表。

这就是我要找的:

列表:

id      |       name
1       |       list1

活动:

id      |       name        |       idList
1       |     Activity1     |         1
2       |     Activity2     |         1
3       |     Activity3     |         1
4       |     Activity4     |         1
5       |     Activity5     |         1
6       |     Activity6     |         1

历史:

date      |    idActivity       
17/07/14  |        1
17/07/14  |        3
17/07/14  |        4
17/07/14  |        6

16/07/14  |        2
16/07/14  |        3
16/07/14  |        5

预期结果:

idActivity     |     idList     |      activityName      |        date           
    1          |        1       |       Activity1        |      17/07/14
    2          |        1       |       Activity2        |        NULL
    3          |        1       |       Activity3        |      17/07/14
    4          |        1       |       Activity4        |      17/07/14
    5          |        1       |       Activity5        |        NULL
    6          |        1       |       Activity6        |      17/07/14

    1          |        1       |       Activity1        |        NULL
    2          |        1       |       Activity2        |      16/07/14
    3          |        1       |       Activity3        |      16/07/14
    4          |        1       |       Activity4        |        NULL
    5          |        1       |       Activity5        |      16/07/14
    6          |        1       |       Activity6        |        NULL

【问题讨论】:

    标签: mysql sql database logging history


    【解决方案1】:

    “诀窍”是使用 CROSS JOIN(或半交叉连接)操作和 history 表中的不同日期列表来生成要返回的行集。

    然后将LEFT JOIN(外连接)到history 表以查找匹配的历史记录行。

    类似这样的:

    SELECT a.id             AS idActivity
         , a.idList         AS idList
         , a.name           AS activityName
         , h.date           AS `date`
      FROM activity a
     CROSS
      JOIN ( SELECT s.date
               FROM history s
             GROUP BY s.date
           ) r
      LEFT
      JOIN history h
        ON h.idActivity = a.id
       AND h.date = r.date
     ORDER 
        BY r.date
         , a.id
    

    该查询从activity 获取六行,从history 获取两行(date 的不同值)(内联视图别名为 r)。 CROSS JOIN 操作将六行中的每一行与两行中的每一行进行匹配,以产生 12 行的笛卡尔积。

    要获得按指定顺序返回的行,我们先按date 排序,然后按activity.id 排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      相关资源
      最近更新 更多