【问题标题】:Wrong answer in My_SQL QueryMySQL 查询中的错误答案
【发布时间】:2020-07-10 13:42:31
【问题描述】:

我的问题是“计算每年只有女性演员的电影数量”。

表架构如下:

--------------------   -----------------------   ----------------------
|       Movie      |   |     Person           |  |       Cast         |
--------------------   ------------------------  ----------------------
| MID    |   year  |   |  PID     |   Gender  |  |    MID   |    PID  |
--------------------   ------------------------  ----------------------

我编写了以下 MySQL 查询:

SELECT m.year, COUNT(m.MID) AS Movies_Female FROM Movie m
        WHERE m.MID IN ( SELECT Q.MID FROM ( SELECT m_c.MID, COUNT(m_c.PID) AS No_Actors FROM M_Cast m_c GROUP BY m_c.MID) Q 
        WHERE Q.No_Actors = ( SELECT COUNT(m__c.PID) FROM M_Cast m__c JOIN PERSON p 
        ON TRIM(p.PID) = TRIM(m__c.PID)
        WHERE m__c.MID = Q.MID AND TRIM(p.Gender) = 'Female')) GROUP BY m.year

但是我得到的输出是:

    year    Movies_Female
0   1939        1
1   1999        1
2   2000        1
3   2009        1
4   2012        1
5   2018        1

但是当我手动检查 2009 年和 2012 年时,没有任何只有女性演员的电影。请解决我的查询哪里出错了?

【问题讨论】:

  • 请问您能否改进 SQL 查询的格式?目前很难阅读。
  • 你确定你的意思是count the number of films with only female actors(这几乎排除了几乎所有电影,除了奇怪的艺术电影)
  • @MrHeelis 对我来说似乎是一个合理的要求;那么如果是一个小数字呢?
  • @Strawberry 因为他很可能没有彻底解释他的那部分问题,听听他说“在 2009 年和 2012 年我没有任何”......如果是他所说的,要检查他是否正确,他所要做的就是一个 m2m,按两者的数量和女性的数量排序,并在身体上寻找总数等于女性的所有时间..
  • @Heelis 我对返回的所有 MID 运行查询,所有演员在女性所在的位置,然后手动检查这些 MID 并找到这 6 个 MID 的 PID 和 Gender。所以我发现年份是 2009 年和 2012 年的这两个值是不正确的。我手动找到的那些值的性别是“无”

标签: mysql sql join


【解决方案1】:

您可以使用not exists 过滤掉至少有一位非女性演员的电影:

select m.year, count(*) as movies_female 
from movie m
where not exists (
    select 1 
    from cast c
    inner join person p on p.pid = c.pid
    where c.mid = m.mid and p.gender <> 'Female'
)
group by m.year

这假设每部电影在cast 中至少有一个条目(这似乎是一个合理的假设)。

【讨论】:

    猜你喜欢
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    相关资源
    最近更新 更多