#mysql #sql
#mysql #sql
Вопрос:
У меня есть следующая таблица под названием genkeyword:
---------------------------------------------------------------------------
| id | title | genre | keyword | year |
----------------------------------------------------------------------------
| 315 | Harry Potter | drama | magic | 2011 |
| 315 | Harry Potter | mystery | magic | 2011 |
| 315 | Harry Potter | adventure | magic | 2011 |
| 315 | Harry Potter | fantasy | magic | 2011 |
| 315 | Harry Potter | drama | witch | 2011 |
| 315 | Harry Potter | mystery | witch | 2011 |
| 315 | Harry Potter | adventure | witch | 2011 |
| 315 | Harry Potter | fantasy | witch | 2011 |
| 407 | Cinderella | fantasy | prince | 2015 |
| 407 | Cinderella | drama | prince | 2015 |
| 407 | Cinderella | fantasy | prince | 2015 |
| 407 | Cinderella | drama | prince | 2015 |
| 826 | The Shape of Water | horror | scientist | 2017 |
| 826 | The Shape of Water | adventure | scientist | 2017 |
| 826 | The Shape of Water | thriller | scientist | 2017 |
| 826 | The Shape of Water | drama | scientist | 2017 |
| 826 | The Shape of Water | horror | friendship | 2017 |
| 826 | The Shape of Water | adventure | friendship | 2017 |
| 826 | The Shape of Water | thriller | friendship | 2017 |
| 826 | The Shape of Water | drama | friendship | 2017 |
---------------------------------------------------------------------------
У меня есть следующий запрос, который получает частоту всех жанров, которые каждый фильм в приведенной выше таблице имеет общего с Гарри Поттером:
select title, year, count(distinct genre) as genre_freq from genkeyword
where genre in (select genre from genkeyword where title='Harry Potter') and
title <> 'Harry Potter' group by
title, year order by genre_freq desc;
Вывод должен быть:
--------------------------------------------------
| title | year | genre_freq |
---------------------------------------------------
| Cinderella | 2015 | 2 |
| The Shape of Water | 2017 | 2 |
----------------------------------------------------
Однако мне трудно понять, как именно работает count (отдельный жанр) в запросе. Я знаю, что SELECT DISTINCT возвращает только отдельные значения и устраняет повторяющиеся записи из результатов. Я не уверен, когда счетчик (отдельный жанр) фактически удаляет повторяющиеся записи. Я действительно хотел бы понять, что запрос делает за кулисами.
Что я знаю до сих пор:
Для каждого кортежа в genkeyword:
- ‘Где genre в (выберите genre из genkeyword, где title=’Гарри Поттер’)’, извлекает все строки, в которых значение атрибута genre является жанром в Гарри Поттере.
- Если жанр в рассматриваемом кортеже находится в результирующем наборе, возвращаемом предложением where , то он учитывается по количеству (отдельный жанр). Также значением movie в рассматриваемом кортеже не может быть Гарри Поттер, иначе оно не будет учитываться.
Однако, когда счетчик (отдельный жанр) фактически удаляет дубликаты? Приветствуется любая информация.
Комментарии:
1.
distinct genre
удаляет дубликаты так жеselect distinct genre
, как и раньше, иcount()
подсчитывает строки, которые остаются послеdistinct
применения is..
Ответ №1:
Короче COUNT(DISTINCT [Colnum])
говоря, будет сделано DISTINCT
для удаления значения colnum дубликатов перед ним COUNT
.
Из вашего образца данных и условия запроса.
| title | genre | year |
| ------------------ | --------- | ---- |
| Cinderella | fantasy | 2015 |
| Cinderella | drama | 2015 |
| Cinderella | fantasy | 2015 |
| Cinderella | drama | 2015 |
| The Shape of Water | adventure | 2017 |
| The Shape of Water | drama | 2017 |
| The Shape of Water | adventure | 2017 |
| The Shape of Water | drama | 2017 |
При использовании count(distinct genre)
вы удалите genre
дубликаты.
Вы можете получить count
такой результат.
| title | year | genre |
| ------------------ | ---- | --------- |
| Cinderella | 2015 | fantasy |
| Cinderella | 2015 | drama |
| The Shape of Water | 2017 | adventure |
| The Shape of Water | 2017 | drama |
Так вы получите, когда будете использовать свой запрос.
| title | year | genre_freq |
----------------------|-----------|----------------|
| Cinderella | 2015 | 2 |
| The Shape of Water | 2017 | 2 |