我在这里有点帮助。
我在MySQL中建立一个数据库,我将在那里进行一系列不同的活动。每项活动都是列表的一部分。
所以,我的数据库中有以下表格。
列表
活动
我也想知道每个活动何时结束(你可以多次完成同样的活动)。为了做到这一点,我有另一张桌子:
历史
当用户完成活动时,我将此活动的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
答案 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
排序。