Для данного набора данных, как я могу проверить, содержит ли вход всю группу данных? - PullRequest
0 голосов
/ 16 мая 2019

Перевод с примером:
Для данного набора фильмов, как я могу получить его категорию и сказать, получили ли мы полный набор в качестве входных данных или нет?

        -------------------------
        | CATEGORY   | MOVIE    |
        -------------------------
        | Fantasy    | Hobbit   |
        | Fantasy    | Hellboy  |
        | Romance    | Twilight |
        | Mystery    | Memento  |
        | Mystery    | Get Out  |

Например, если я введу Hobbit, Hellboy в качестве ввода, я должен вернуться

        -------------------------------------------
        | CATEGORY | MOVIES          | HASFULLSET |
        -------------------------------------------
        | Fantasy  | Hobbit, Hellboy | 1          |

Если я передам Hobbit, Twilight в качестве ввода, я должен вернуться

        -------------------------------------
        | CATEGORY | MOVIES    | HASFULLSET |
        -------------------------------------
        | Fantasy  | Hobbit    | 0          |
        | Romance  | Twilight  | 1          |

Я не могу выйти за пределы этого без использования подзапроса.

SELECT Category, COUNT(*) AS GRP_COUNT 
FROM movie
WHERE Movies IN (@movies)
GROUP BY Category

Ответы [ 3 ]

1 голос
/ 16 мая 2019

Попробуйте запрос ниже:

SET @movies = 'Hobbit,Hellboy';
select category,
       group_concat(case when find_in_set(Movie,@movies) then movie end) AS movies,
           case when
             count(*) = sum(case when find_in_set(Movie,@movies) then 1 else 0 end)
           then 1 else 0 end FullSet
from tbl
group by category
having movies != '';

Демо

0 голосов
/ 16 мая 2019

Этот запрос состоит из нескольких хитрых частей:

  • Сравнение совпадений в вашем списке с итогом по категории.
  • Выбор только совпадающих категорий.

Вы можете решить эти проблемы с помощью условного агрегирования.То есть фильтр в функциях агрегирования, а не в WHERE:

SELECT Category,
       GROUP_CONCAT(CASE WHEN m.movie IN ( . . . ) THEN m.movie END) as movies,
       ( COUNT(*) = SUM(m.movie IN ( . . . ) ) as has_full_set
FROM movies m
GROUP BY Category
HAVING SUM( m.movie IN ( . . . ) ) > 0;

* HAVING возвращает только категории, в которых есть соответствующий фильм.

Если вы хотите отобразить только списокПри вводе фильмов один раз можно использовать подзапрос:

select category,
       group_concat(case when has_movie then movie end) as movies,
       ( count(*) = sum(has_movie) ) as has_full_set
from (select m.*,
             (m.movie in ( . . . )) as has_movie
      from m
     ) m
group by category
having sum(has_movie) > 0;
0 голосов
/ 16 мая 2019

РЕДАКТИРОВАНИЕ: Итак, я неправильно прочитал вопрос и опубликовал неправильный ответ ранее. Но не волнуйтесь, я внес поправку в запрос, который я разместил ранее. Что касается «без использования подзапроса», я пока не могу придумать, P

SELECT m.Category, 
       GROUP_CONCAT(movie) AS Movie,
       IF(COUNT(m.movie)=fullset, 1,0) AS HASFULLSET
    FROM movie m
        LEFT JOIN 
        (SELECT category,COUNT(*) AS fullset FROM movie GROUP BY category) fs
         ON m.category=fs.category
     WHERE Movie IN ('Hobbit', 'Twilight')
GROUP BY m.Category;
...