mysql - 统计MySQL中属于某个类别的记录

标签 mysql find-occurrences

我一直在与一些 SQL 作斗争,但似乎无法理解它。

我有两个表,一个是类别列表,另一个是我所有的文章。

我想做的是找出每个类别有多少篇文章。

这是我到目前为止的 SQL

SELECT DISTINCT COUNT( po.post_Cat_ID ) AS Occurances, ca.cat_Title
FROM Posts po, Categories ca
WHERE ca.cat_ID = LEFT( po.post_Cat_ID, 2 )

我使用 LEFT 的原因是只获取主要类别,因为我列出的类别如下...例如

Science = 01
Medicine = 0101
Sport = 02

say asprin 上的帖子因此会有一个 cat_ID 为 0101。(然后 LEFT 会将 0101、0102、0103 等修剪为 01)。基本上我对子类别不感兴趣。

提前致谢


结果

SELECT DISTINCT COUNT( po.post_Cat_ID ) AS Occurances, ca.cat_Title
FROM Posts po, Categories ca
WHERE ca.cat_ID = LEFT( po.post_Cat_ID, 2 )
GROUP BY LEFT( po.post_Cat_ID, 2 )

附注谢谢@nullpointer,目前有效,我会考虑重组 对于其他读者,这里再次链接

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

最佳答案

向 Categories 添加一列,给出每个类别所在的主要类别(主要类别给出自己)。所以:

cat_id | main_cat_id | title
-------+-------------+---------
01     | 01          | Science
0101   | 01          | Medicine
02     | 02          | Sport

在cat_id = main_cat_id上从中选择,找到主要类别;在 left.cat_id = right.main_cat_id 上重新连接到自身以找到子类别,然后在 cat_id = cat_id 上连接到帖子。按 left.cat_id 分组并投影到 cat_id 和 count(*)。

我在 PostgreSQL 8.4 中试过这个,但我不明白为什么这在 MySQL 中不起作用,因为查询非常基础。我的表:

create table categories(
  cat_id varchar(40) primary key,
  main_cat_id varchar(40) not null references categories,
  title varchar(40) not null
)

create table posts (
  post_id integer primary key,
  cat_id varchar(40) not null references categories,
  title varchar(40) not null
)

我的查询(按标题而不是 ID 分组):

select m.title, count(*)
from categories m, categories c, posts p
where m.cat_id = c.main_cat_id
  and c.cat_id = p.cat_id
group by m.title

更新:正如 OP 所尝试的那样,我也尝试过使用字符串操作来完成这项工作。查询(在 PostgreSQL 接受的符合标准的 SQL 中,而不是 MySQL 的方言中)是:

select m.title, count(*)
from categories m, posts p
where m.cat_id = substring(p.cat_id from 1 for 2)
group by m.title;

效果很好。我无法提供关于速度的有意义的比较,但此查询计划确实比双向连接的查询计划简单一些。

关于mysql - 统计MySQL中属于某个类别的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3642447/

相关文章:

c++ - 查找子字符串出现的次数

安装 Apache Cassandra 后 MySQL 服务器未启动

mysql - FROM_UNIXTIME() 返回纪元,而不是日期

php - Mysql索引最佳实践

mysql - 如何在 MYSQL 中修复错误的导入日期时间

php - Sphinx 搜索对某些字段建立索引,但对其他字段不建立索引

SED 替换了一些首次出现(和范围)的模式

java - 我想显示字符串中某个字符的出现。我怎样才能改进我的代码?

c - 在 C 中删除另一个字符串中出现的字符串(代码和错误消息)