gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:40:27 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com