【发布时间】:2011-07-23 12:16:04
【问题描述】:
这是上一个问题的后续问题:Complicated COUNT query in MySQL。没有一个答案在所有条件下都有效,而且我也很难找到解决方案。我将向第一个提供完全正确答案的人奖励 75 分奖励(我将在奖励可用时立即奖励,作为参考,我之前已经这样做过:Improving Python/django view code)。
我想获取用户拥有的视频积分计数并且不允许重复(即,对于每个视频,用户可以在其中获得 0 或 1 次积分。我想找到三个计数:用户的视频数量已上传(简单)--Uploads;用户未上传的视频中计入的视频数--Credited_by_others;以及用户已计入的视频总数--Total_credits。
我有三张桌子:
CREATE TABLE `userprofile_userprofile` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`full_name` varchar(100) NOT NULL,
...
)
CREATE TABLE `videos_video` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` int(11) NOT NULL,
`uploaded_by_id` int(11) NOT NULL,
...
KEY `userprofile_video_e43a31e7` (`uploaded_by_id`),
CONSTRAINT `uploaded_by_id_refs_id_492ba9396be0968c` FOREIGN KEY (`uploaded_by_id`) REFERENCES `userprofile_userprofile` (`id`)
)
注意uploaded_by_id与userprofile.id相同
CREATE TABLE `videos_videocredit` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`video_id` int(11) NOT NULL,
`profile_id` int(11) DEFAULT NULL,
`position` int(11) NOT NULL
...
KEY `videos_videocredit_fa26288c` (`video_id`),
KEY `videos_videocredit_141c6eec` (`profile_id`),
CONSTRAINT `profile_id_refs_id_31fc4a6405dffd9f` FOREIGN KEY (`profile_id`) REFERENCES `userprofile_userprofile` (`id`),
CONSTRAINT `video_id_refs_id_4dcff2eeed362a80` FOREIGN KEY (`video_id`) REFERENCES `videos_video` (`id`)
)
下面是一步一步来说明:
1) 创建 2 个用户:
insert into userprofile_userprofile (id, full_name) values (1, 'John Smith');
insert into userprofile_userprofile (id, full_name) values (2, 'Jane Doe');
2) 用户上传视频。他还没有将任何人——包括他自己——归功于其中。
insert into videos_video (id, title, uploaded_by_id) values (1, 'Hamlet', 1);
结果应该如下:
**User** **Uploads** **Credited_by_others** **Total_credits**
John Smith 1 0 1
Jane Doe 0 0 0
3) 上传视频的用户现在将自己的功劳归于视频。请注意,这不应该改变任何事情,因为用户已经收到了上传电影的信用并且我不允许重复信用:
insert into videos_videocredit (id, video_id, profile_id, position) values (1, 1, 1, 'director')
结果现在应该如下:
**User** **Uploads** **Credited_by_others** **Total_credits**
John Smith 1 0 1
Jane Doe 0 0 0
4) 用户现在在同一个视频中又两次将自己的功劳归于自己(即,他在视频中有多个“位置”)。此外,他在该视频中三度称赞 Jane Doe:
insert into videos_videocredit (id, video_id, profile_id, position) values (2, 1, 1, 'writer')
insert into videos_videocredit (id, video_id, profile_id, position) values (3, 1, 1, 'producer')
insert into videos_videocredit (id, video_id, profile_id, position) values (4, 1, 2, 'director')
insert into videos_videocredit (id, video_id, profile_id, position) values (5, 1, 2, 'editor')
insert into videos_videocredit (id, video_id, profile_id, position) values (6, 1, 2, 'decorator')
结果现在应该如下:
**User** **Uploads** **Credited_by_others** **Total_credits**
John Smith 1 0 1
Jane Doe 0 1 1
5) Jane Doe 现在上传视频。她没有归功于自己,但在视频中两次归功于 John Smith:
insert into videos_video (id, title, uploaded_by_id) values (2, 'Othello', 2)
insert into videos_videocredit (id, video_id, profile_id, position) values (7, 2, 1, 'writer')
insert into videos_videocredit (id, video_id, profile_id, position) values (8, 2, 1, 'producer')
结果现在应该如下:
**User** **Uploads** **Credited_by_others** **Total_credits**
John Smith 1 1 2
Jane Doe 1 1 2
所以,我想为每个用户找到这三个字段——Uploads、Credited_by_others 和 Total_credits。数据永远不应为 Null,而应在字段没有计数时为 0。谢谢。
【问题讨论】:
-
(5)下,应该是
(7, 2, 1)和(8, 2, 1)吗? -
再次澄清一下,简仅因上传而获得功劳,对吗?她不需要在自己上传的内容中明确注明出处吗?
-
正确。上传视频会自动将功劳归功于上传视频的用户。因此,如果有人上传了一个视频,无论他们在该视频中获得 0 次还是 1000 次的信用,他们仍然会获得 1 次信用。 (附带说明,只有参与制作视频的个人才能上传视频,例如,视频不会由不参与视频的随机个人上传。)