[英]Find all the values in a column for a condition in other column
我有一個名為female
的 SQL 視圖,如下所示
+----------+----------+--------+------+
| actor_id | movie_id | gender | year |
+----------+----------+--------+------+
| 528787 | 2 | M | 1996 |
| 528788 | 2 | F | 1952 |
| 528789 | 1 | M | 2001 |
| 528790 | 3 | M | 1994 |
| 528791 | 2 | F | 2000 |
| 528791 | 3 | F | 2004 |
| 528791 | 4 | F | 2000 |
| 528791 | 5 | F | 2001 |
| 528792 | 4 | F | 1999 |
| 528792 | 6 | F | 2000 |
+----------+----------+--------+------+
...等等
這里的actor_id
和movie_id
形成了唯一的組合。 我需要找到只有女演員工作的所有movie_id
。 這意味着我需要排除所有只有男性或男女演員都工作的電影。
預期輸出
+----------+----------+--------+------+
| actor_id | movie_id | gender | year |
+----------+----------+--------+------+
| 528791 | 4 | F | 2000 |
| 528791 | 5 | F | 2001 |
| 528792 | 4 | F | 1999 |
| 528792 | 6 | F | 2000 |
+----------+----------+--------+------+
請幫助我了解解決方案以及對此的可能查詢。
對不起,如果這對你們中的一些人來說太明顯了。
給出的答案不正確,因為我編寫了一個 python 代碼來交叉驗證這些值,並且我得到了18927
計數。
NOT EXISTS
在腦海中:
select f.*
from female f
where not exists (select 1
from female f2
where f2.movie_id = f.movie_id and f2.gender = 'M'
);
如果你只想要電影而不是原始行,那么我會使用聚合:
select movie_id
from female f
group by movie_id
having min(gender) = max(gender) and min(gender) = 'F';
您可以嘗試如下
SELECT *
FROM [female]
WHERE movie_id IN (SELECT movie_id
FROM [female]
GROUP BY movie_id
HAVING Max(gender) = Min(gender)
AND Max(gender) = 'F')
如果視圖中有重復項,並且您不希望重復項出現在輸出中,則可以嘗試如下操作。
SELECT distinct actor_id , movie_id , gender , year
FROM [female]
WHERE movie_id IN (SELECT movie_id
FROM [female]
GROUP BY movie_id
HAVING Max(gender) = Min(gender)
AND Max(gender) = 'F')
在性別“M”上使用 Not IN:
SELECT * FROM `test_data`
where movie_id
NOT IN (SELECT movie_id from test_data where gender = 'M')
嘗試這個
SELECT *
FROM female
WHERE gender='F'
AND movieId NOT IN (SELECT movieId FROM female WHERE gender='M');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.