【问题标题】:Finding count of occurrences from a table of unique values从唯一值表中查找出现次数
【发布时间】:2019-10-19 21:30:40
【问题描述】:

我有一个包含三个表的电影数据库。电影参与、人物和电影角色

我的问题是,我必须找到在 200 多部电影中扮演独特角色的每位演员。

一个独特的角色,是一个在电影角色表中只出现一次的角色。

我认为我通过以下查询找到了唯一字符表

SELECT filmcharacter.partid FROM filmcharacter GROUP BY 
filmcharacter.partid HAVING count(*) = 1;

我将其重写为 WITH 语句,形式为

WITH unique_table(partid) AS (SELECT partid FROM filmcharacter GROUP 
BY partid HAVING count(*) = 1)

但是我不确定如何进一步解决这个问题。我打算使用 WITH 来创建一个包含我需要的数据的表,然后选择我想要的行,将它们与相关的东西连接起来。

   WITH unique_table(partid) AS (SELECT partid FROM filmcharacter 
   INNER 
   JOIN filmparticipation ON(filmcharacter.partid = 
   filmparticipation.partid) INNER JOIN person(person.personid = 
   filmparticipation.personid) GROUP 
   BY partid)

我不知道接下来我尝试过如何继续

   WITH unique_table(partid) AS (SELECT partid FROM filmcharacter 
   INNER 
   JOIN filmparticipation ON(filmcharacter.partid = 
   filmparticipation.partid) INNER JOIN person(person.personid = 
   filmparticipation.personid) GROUP 
   BY partid) SELECT * FROM unique_table GROUP BY partid HAVING 
   count(partid) > 200;

但如果发送它,我会得到查询零表。

这些表有以下键:

Filmparticipation(personid, partid)

Filmcharacter(partid)

Person(personid)

我期望得到的是类似于表格的东西。它有一个标识演员(personid)的 ID,以及他们作为唯一角色出现的次数

  Actor       Count
----------|----------
     1        201
     2        309

【问题讨论】:

  • 当你得到一个你不期望/不理解的结果时,停止试图找到你的总体目标并找出你的误解是什么。--隔离第一个意外/误解的子表达式及其输入 &输出并了解是什么误解、错字、错误推理等导致了它。然后编写一个新的整体查询。 (调试基础。)

标签: mysql join count


【解决方案1】:

您可以将personfilmparticipation 加入表并使用not exists 以确保相同的partid 不会再次出现在filmparticipation 中:

select p.personid, count(*) as `count`
from person p
inner join filmparticipation fp on fp.personid = p.personid
where not exists (
    select 1
    from filmparticipation fp1
    where fp1.partid = fp.partid and fp.personid != p.personid
)
group by p.personid
having count(*) > 200

如果您运行的是 MySQL 8.0,这也可以通过窗口计数来实现:

select personid, count(*)
from (
    select p.personid, count(*) over(partition by fp.partid) cnt
    from person p
    inner join filmparticipation fp on fp.personid = p.personid
) x
where cnt = 1
group by person_id
having count(*) > 200

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2021-04-02
    • 2013-09-13
    相关资源
    最近更新 更多