SQL: понимание того, как SELECT DISTINCT устраняет дубликаты

#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         |