Ошибка GROUP BY при использовании одного оператора Count () в предложении WHERE - PullRequest
1 голос
/ 30 марта 2019

Я получаю Error Code 1111. Invalid use of group function при использовании оператора Count () в условии where. Я считаю, что проблема заключается в том, что мне не разрешено использовать операторы count в предложении WHERE, но в остальном я не уверен, как привести число строк в пригодное для использования состояние.

Цель запроса - выбрать поля, в которых Субъект видел более одного фильма. Хитрость в том, что subject_id - это составной ключ с movie_id. У меня проблемы с фильтрацией строк, в которых субъект видел только один фильм.

Запрос:

SELECT 
    measures.Subject_id, 
    measures.Movie_id, 
    measures.Median_heart_rate AS Variation 
FROM measures 
WHERE COUNT(measures.Subject_id) > 1;

Результат:

Subject_id     Movie_id     Variation
001            1            45
001            35           15
002            42           2        
003            1            4
003            2            5

Ожидаемые результаты:

Subject_id     Movie_id     Variation
001            1            45
001            35           15   
003            1            4
003            2            5

Ответы [ 4 ]

1 голос
/ 30 марта 2019

COUNT должен быть в предложении SELECT, а не в предложении WHERE.
Для фильтрации неповторяющихся строк subject_id может использоваться внутренний запрос с COUNT:

SELECT `subject_id`, 
       `movie_id`, 
       `median_heart_rate` AS Variation 
FROM   `measures` m1
WHERE  (SELECT Count(1) 
        FROM   `measures` m2
        WHERE  m2.`subject_id` = m1.`subject_id`) > 1; 
0 голосов
/ 30 марта 2019

Я бы просто использовал exists:

SELECT m.Subject_id, m.Movie_id, 
       m.Median_heart_rate AS Variation 
FROM measures m
WHERE EXISTS (SELECT 1
              FROM measures m2
              WHERE m2.Subject_id = m.Subject_id AND
                    m2.Movie_id <> m.Movie_id
             );

Если ваш первичный ключ действительно measures(Subject_id, Movie_id), то он также должен иметь очень хорошую производительность.

0 голосов
/ 30 марта 2019

Решение закончилось так:

SELECT measures.Subject_id, measures.Movie_id, measures.Median_heart_rate AS Variation 
FROM measures 
WHERE measures.Subject_id IN (SELECT  DISTINCT Subject_id FROM measures GROUP BY Subject_id HAVING COUNT(Subject_id) > 1);
0 голосов
/ 30 марта 2019

В MySQL 8.0 вы можете использовать оконную функцию COUNT(...) OVER(...), чтобы проверить, сколько фильмов посмотрел каждый пользователь. Тогда внешний запрос просто отфильтровывает записи на основе этого значения:

SELECT *
FROM (
    SELECT 
        Subject_id, 
        Movie_id, 
        Variation,
        COUNT(*) OVER (PARTITION BY Subject_id) cnt
    FROM measures
) x
WHERE cnt > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...