Как я могу написать этот оператор SQL, анализируя частоту используемых ключевых слов? - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть база данных mysql, содержащая статьи в блогах.Каждая статья имеет несколько ключевых слов, которые m: n связаны с использованием таблицы «art_key».

Таблица, содержащая саму статью:

table articles {
  id, 
  title,
  text
}

Таблица, содержащая каждое ключевое слово один раз:

table keywords {
  id,
  word
}

Таблица, объединяющая статьи и ключевые слова: одна статья содержит несколько ключевых слов, а одно ключевое слово может использоваться в нескольких статьях.

table art_key {
  id,
  article_id,
  keyword_id
}

Некоторые статьи содержат рисунки.У них есть дополнительное ключевое слово «[PICTURE]».

Для анализа я хотел бы увидеть, как часто (в скольких статьях) использовалось каждое ключевое слово и для каждого ключевого слова: какой процент статей, содержащих этоключевые слова имеют изображение (имеют ключевое слово «[PICTURE]»).

Кроме того, анализ должен быть без учета регистра и убирать начальные пробелы.Таким образом, ключевые слова «sql», «SQL», «sqL», «SqL» следует рассматривать как одно ключевое слово «sql».

Как мне написать этот запрос, используя оператор SQL?

Спасибо!

1 Ответ

0 голосов
/ 03 декабря 2018

Этот запрос должен делать то, что вы хотите.Он соединяет список ключевых слов с таблицей art_key, чтобы найти все статьи с данным ключевым словом, а затем соединяет его со списком статей с изображениями (который находится в отдельном подзапросе JOIN), чтобы определить, сколько статей сВ данном ключевом слове есть картинки.Ключевые слова предварительно обрабатываются и группируются для отображения с использованием LOWER и TRIM, чтобы сделать результат без учета регистра и толерантным к пробелу.

SELECT LOWER(TRIM(k.word)) AS keyword
     , COUNT(DISTINCT a.article_id) AS num_articles
     , COUNT(DISTINCT p.article_id) / COUNT(DISTINCT a.article_id) * 100 AS percent_with_pictures
FROM keywords k
LEFT JOIN art_key a ON a.keyword_id = k.id
LEFT JOIN (SELECT a.article_id
                , COUNT(DISTINCT a.article_id) AS num_pictures
           FROM art_key a
           JOIN keywords k ON k.id = a.keyword_id AND LOWER(TRIM(k.word)) = '[picture]'
           GROUP BY a.article_id) p ON p.article_id = a.article_id
GROUP BY keyword
HAVING COUNT(a.article_id) > 0

Я создал небольшую демонстрацию для SQLFiddle , чтобы показать, как я интерпретировал ваш вопрос и как работает запрос.

create table keywords (id int auto_increment primary key, word varchar(20));
insert into keywords (word) values
('sql'), ('SQL '), (' SQL'), ('SQl'), (' sQl '), ('MySQL'), ('[PICTURE]');
create table art_key(id int auto_increment primary key, article_id int, keyword_id int);
insert into art_key (article_id, keyword_id) values
(1, 2), (1, 3), (1, 4), (1, 6), (2, 1), (2, 5), (3, 4), (4, 5), (4, 2), (4, 6), (1, 7), (4, 7);

Вывод:

keyword     num_articles    percent_with_pictures
mysql       2               100
sql         4               50
[picture]   2               100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...