SQLite - выберите 3 условия из таблицы и GROPING BY - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть эта таблица после объединений:

   p_id  |a_name |bY  |   city   |   a_id  |p_id|  role   |t_name|p_id|
304804123|Shir   |1980|beer sheba|304804123|111 |meri     |Abima |111 |
304226152|Noa    |1992|tel aviv  |304226152|111 |sonia    |Abima |111 |
251445841|Avi    |1998|haifa     |251445841|222 |tov tov  |Miskan|222 |
204458952|Dani   |1993|sderot    |204458952|222 |gamad    |Abima |222 |
221354875|Osher  |1995|beer sheba|221354875|333 |prince   |Akamri|333 |
304804123|Shir   |1980|beer sheba|304804123|222 |princes  |Abima |222 |
304804123|Shir   |1980|beer sheba|304804123|333 |singar   |Abima |333 |
304226152|Noa    |1992|tel aviv  |304226152|333 |singarit |Abima |333 |
304226152|Noa    |1992|tel avia  |304226152|333 |singarit2|Abima |333 |

мне нужно из таблицы имена всех актеров (a_name), которые сыграли не менее трех пьес (p_id) и чей год рождения (bY)1980 или больше.я могу получить его в соответствии со следующим запросом:

SELECT a_name FROM (SELECT *, COUNT(Play.p_id) AS 
    COUNT_NUM_OF_PLAY_EACH_ACTOR 
FROM Actor, Play, Role WHERE 
    Actor.a_id = Role.a_id AND Role.p_id = Play.p_id
GROUP BY a_name) WHERE COUNT_NUM_OF_PLAY_EACH_ACTOR >= 3 
    AND birthYear >= 1980;

результат:

Noa
Shir

, но добавил к моему условию, что если игрок появился в более чем одной роли в одной и той же, показать егодо сих пор считается одним шоу.В моем запросе актер Ноа сыграла в 111, 444, 333 шоу, но она сыграла 2 роли в 333 шоу, как я могу рассматривать это как одно шоу?

желаемый результат:

Noa <- remove this because noa played in 2 shows only and not 3.
Shir

Ответы [ 2 ]

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

Никогда не используйте запятые в предложении FROM. Всегда используйте правильный, явный, стандартный JOIN синтаксис.Кроме того, вам не нужен подзапрос:

SELECT a.a_id, a.name  -- in case two actors have the same name
FROM Actor a JOIN
     Role r
     ON a.a_id = r.a_id
WHERE a.birth_year >= 1980
GROUP BY a.a_id, a.name
HAVING COUNT(DISTINCT r.p_id) >= 3;

Примечания:

  • Псевдонимы таблиц облегчают написание и чтение запроса.
  • Вам следуетвключите a_id в GROUP BY, чтобы справиться с ситуацией, когда два актера имеют одно и то же имя.
  • Подзапрос не требуется.
  • Использование JOIN !!!
0 голосов
/ 28 февраля 2019

Вы можете использовать разные для того же, пожалуйста, попробуйте ниже одного

SELECT a_name FROM (SELECT *, COUNT(distinct Play.p_id) AS 
    COUNT_NUM_OF_PLAY_EACH_ACTOR 
FROM Actor, Play, Role WHERE 
    Actor.a_id = Role.a_id AND Role.p_id = Play.p_id
GROUP BY a_name) WHERE COUNT_NUM_OF_PLAY_EACH_ACTOR >= 3 
    AND birthYear >= 1980;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...