Это продолжение предыдущего вопроса: Сложный запрос COUNT в MySQL .Ни один из ответов не сработал при любых условиях, и у меня тоже были проблемы с поиском решения.Я буду назначать награду в 75 баллов первому человеку, который предоставит полностью правильный ответ (я буду назначать награду, как только она будет доступна, и в качестве справки я уже делал это раньше: Улучшение кода представления Python / django).
Я хочу получить количество видео-кредитов, которые есть у пользователя, и не допустить дублирования (т. Е. Для каждого видео пользователь может быть зачислен в него 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) Теперь пользователь зачисляется на себя еще два раза в одном и том же видео (т. Е. У него было несколько «позиций» в видео).Кроме того, он зачисляет Джейн Доу три раза за это видео:
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) Теперь Джейн Доу загружает видео.Она не доверяет себе, но дважды отмечает Джона Смита в видео:
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
.Данные никогда не должны быть нулевыми, а вместо этого равны 0, если поле не имеет значения.Спасибо.