如何在MySQL上获取查询等历史记录?

时间:2014-07-17 21:41:43

标签: mysql sql database logging history

我在这里有点帮助。

我在MySQL中建立一个数据库,我将在那里进行一系列不同的活动。每项活动都是列表的一部分。

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

列表

  • ID
  • 名称

活动

  • ID
  • 名称
  • idList(FK to List)

我也想知道每个活动何时结束(你可以多次完成同样的活动)。为了做到这一点,我有另一张桌子:

历史

  • 日期
  • idActivity(FK to activity)

当用户完成活动时,我将此活动的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

1 个答案:

答案 0 :(得分:2)

“技巧”是使用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的六行,以及来自date的两行(history的不同值)(内联视图别名为 r )。 CROSS JOIN操作将六行中的每一行与两行中的每一行匹配,以产生12行的笛卡尔积。

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