Найти все значения в столбце для условия в другом столбце - PullRequest
0 голосов
/ 07 февраля 2019

У меня SQL-представление с именем female выглядит следующим образом

+----------+----------+--------+------+
| 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.

Ответы [ 4 ]

0 голосов
/ 07 февраля 2019

Попробуйте это

SELECT *
FROM female
WHERE gender='F'
AND movieId NOT IN (SELECT movieId FROM female WHERE gender='M');
0 голосов
/ 07 февраля 2019

Вы можете попробовать выполнить следующие действия:

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') 
0 голосов
/ 07 февраля 2019

Использовать не на полу 'M':

SELECT * FROM `test_data` 
where movie_id 
NOT IN (SELECT movie_id from test_data where gender = 'M')
0 голосов
/ 07 февраля 2019

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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...