【问题标题】:How can I write that SQL statement analyzing the frequency of used keywords?如何编写分析使用关键字频率的 SQL 语句?
【发布时间】:2018-12-02 23:19:40
【问题描述】:

我有一个包含博客文章的 mysql 数据库。每篇文章都有多个关键字,这些关键字通过使用 table 'art_key' 进行 m:n 链接。

包含文章本身的表格:

table articles {
  id, 
  title,
  text
}

每个关键字包含一次的表:

table keywords {
  id,
  word
}

文章和关键词链接表:一篇文章包含多个关键词,一个关键词可以在多篇文章中使用。

table art_key {
  id,
  article_id,
  keyword_id
}

有些文章包含图片。那些有一个额外的关键字“[图片]”。

为了进行分析,我想查看每个关键字的使用频率(在多少篇文章中)以及每个关键字:包含此关键字的文章中有多少百分比有图片(关键字“[图片]”)。

此外,分析应不区分大小写并删除前导空格。所以关键字'sql'、'SQL'、'sql'、'SqL'应该被看作是一个关键字'sql'。

如何使用 SQL 语句编写该查询?

谢谢!

【问题讨论】:

  • 你能展示一下你的第一次尝试吗?或者你正在寻找一些免费的工作?
  • 我自己尝试了很长一段时间,但我不太喜欢 SQL。只能使用慢速 python 脚本编写解决方案。下次会记住的,对不起。

标签: mysql database


【解决方案1】:

这个查询应该做你想做的事。它将关键字列表连接到art_key 表以查找具有给定关键字的所有文章,然后将其连接到具有图片的文章列表(由单独的JOIN 子查询找到)以确定有多少文章具有给定的关键字中有图片。使用LOWERTRIM 对关键字进行预处理和分组显示,以使结果不区分大小写并允许空格。

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

我创建了一个小的demo on 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

【讨论】:

  • 谢谢!!还有一件事:我收到 86 个警告:“除以 0”。这些警告来自哪里?只需仔细检查所有外键约束,它们应该没问题。
  • 当我在语句末尾添加HAVING COUNT(DISTINCT a.article_id) > 1 时,警告消失了。
  • @meini 对不起,在我的小例子中,我没有考虑任何文章中没有的关键字的可能性。您应该能够通过添加HAVING COUNT(a.article_id) > 0 来修复查询;查看我的编辑和更新的演示链接。
  • 当然是>0 不是>1。你真的帮了我很多。再次感谢。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 2022-01-25
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
相关资源
最近更新 更多