2014-07-17 62 views
1

我想在這裏得到一些幫助。如何獲得MySQL上的查詢歷史記錄?

我正在MySQL中建立一個數據庫,我將有一堆不同的活動。每項活動都是列表的一部分。

因此,我在我的數據庫中有以下表格。

列表

  • ID

活動

  • ID
  • 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 

回答

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得到六行,和從history(別名爲r線視圖)兩排(的date不同的值)。 CROSS JOIN操作將六行中的每一行與兩行中的每一行進行匹配,以產生12行的笛卡爾乘積。

要獲得以指定順序返回的行,我們按date排序,然後按activity.id排序。

+0

謝謝!那樣做了! – Abras