我一直在与一些 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/