mysql - MySQL 中复杂的 COUNT 查询

标签 mysql sql aggregate-functions

我正在尝试查找特定用户拥有的视频演职员表数量。

以下是相关的三个表:

CREATE TABLE `userprofile_userprofile` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `full_name` varchar(100) NOT NULL,
   ...
 )

CREATE TABLE `userprofile_videoinfo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(256) NOT NULL,
  `uploaded_by_id` int(11) NOT NULL,
  ...
  KEY `userprofile_videoinfo_e43a31e7` (`uploaded_by_id`),
  CONSTRAINT `uploaded_by_id_refs_id_492ba9396be0968c` FOREIGN KEY (`uploaded_by_id`) REFERENCES `userprofile_userprofile` (`id`)
)

CREATE TABLE `userprofile_videocredit` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `video_id` int(11) NOT NULL,
  `profile_id` int(11) DEFAULT NULL,
  KEY `userprofile_videocredit_fa26288c` (`video_id`),
  KEY `userprofile_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 `userprofile_videoinfo` (`id`)
)

videoinfo 表是当用户上传视频时,他会得到一个“uploaded_by”列表。 videocredit 表是给定电影的所有演职员表。它完全独立于上传电影(即,用户可以上传视频而不注明自己的姓名,而用户可以在他没有上传的视频中注明姓名)。

在尝试查找用户已记入的视频 COUNT 时,我想查找:

# videos a user has uploaded + # of non duplicate-video credits uploaded by others

举例来说:如果用户上传了 5 个名为:

VideoME1, VideoME2, VideoME3, VideoME4, and VideoME5 
(total = 5 videos [`videoinfo.uploaded_by_id`])

并有以下视频出处:

VideoME1 (4 credits - director, writer, editor, choreographer)
VideoME2 (1 credit)
VideoOTHER1 (2 credits - writer, editor)
VideoOTHER2 (1 credit - writer)
(total = 8 video credits [`videocredit.profile_id`])

COUNT 应为 5(上传的视频)+ 2(其他人上传的非重复视频演职员表)= 7。如果用户没有视频演职员表,则应 = 0(即,LEFT OUTER JOIN).

我已经能够算出每个上传/信用的计数,但无法弄清楚如何将两者结合起来并删除重复项。我需要什么 SQL 来执行此操作?谢谢。

顺便说一句,这是我目前对每个(个人)COUNT 的看法:

mysql> SELECT full_name, v.video_id, COUNT(DISTINCT v.video_id) as cnt
    -> FROM userprofile_userprofile u LEFT OUTER JOIN userprofile_videocredit v
    -> ON u.id = V.profile_id
    -> GROUP BY full_name
    -> ORDER BY cnt DESC;

mysql> SELECT full_name, v.id, COUNT(v.uploaded_by_id) as cnt
    -> FROM userprofile_userprofile u LEFT OUTER JOIN userprofile_videoinfo v
    -> ON u.id = v.uploaded_by_id
    -> GROUP BY full_name
    -> ORDER BY cnt DESC;

最佳答案

X-Zero 向数据添加“上传者信用”的建议是保持查询简单的最佳方式。如果这不是一个选项,请在 userprofile_videoinfo 和 userprofile_videocredit 之间进行内部连接,以便轻松消除重复项:

SELECT u.id, u.full_name, COUNT(DISTINCT v.video_id) as credit_count
FROM userprofile_userprofile u
LEFT JOIN (SELECT vi.video_id, vi.uploaded_by_id, vc.profile_id as credited_to_id
    FROM userprofile_videoinfo vi
    JOIN userprofile_videocredit vc ON vi.id = vc.video_id
    ) v ON u.id = v.uploaded_by_id OR u.id = v.credited_to_id
GROUP BY u.id, u.full_name
ORDER BY credit_count DESC

子查询可能有助于创建 View 。

关于mysql - MySQL 中复杂的 COUNT 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6580684/

相关文章:

mysql - 连接两个表并从一列返回多个匹配项的 SQL 查询?

mysql - 如何为第一列有重复的行选择第二列?

mysql - 查询嵌套集表以排除所有标记的子树

sql - PostgreSQL 查询中每个月的最后三个月平均值

mysql为导出的max函数列添加条件

java - 如何编写自定义 CrudRepository 方法(@Query)来过滤我的结果

python - 由于字符串中的单引号或双引号而导致 SQL 语法错误

mysql - 如何在 HQL 查询中检查 NULL 或无效

php - 如何在单个查询中执行多个选择查询并仍然检索值

sql - Oracle SQL 分层查询 : Flatten Hierarchy and Perform Aggregation