MySQL:计算另一个表中字段的最新出现次数
我有多个表来存储有关项目状态的信息 不确定这在一个查询中是否可行,因为我们目前正在使用多个查询来获取此数据 我们有项目表、状态类型表和状态历史记录表 我正在使用的状态历史记录表主要由project\u id、status\u id和date\u added组成MySQL:计算另一个表中字段的最新出现次数,mysql,sql,Mysql,Sql,我有多个表来存储有关项目状态的信息 不确定这在一个查询中是否可行,因为我们目前正在使用多个查询来获取此数据 我们有项目表、状态类型表和状态历史记录表 我正在使用的状态历史记录表主要由project\u id、status\u id和date\u added组成 project_id status_id date_added 1 1 2013-06-10 13:19:20 2 1 2013-07
project_id status_id date_added
1 1 2013-06-10 13:19:20
2 1 2013-07-12 09:12:17
3 1 2013-08-26 22:44:42
1 2 2013-09-24 16:28:25
2 2 2013-10-25 12:52:48
我需要知道目前每个阶段有多少个项目。因此,我需要查看每个项目,并在表中获取其最新记录的状态id
因此,我需要返回的数据如下所示
status_id count
1 1
2 2
谢谢你的帮助
select status_id, count(1) cnt
from statushistory h
where not exists
(select 1 from statushistory h1
where h1.project_id=h.project_id and h1.date_added>h.date_added)
group by status_id
在SQLfiddle中测试
这是它的版本,检查项目表:
select status_id, count(1) cnt
from statushistory h, projects p
where p.project_id=h.project_id and p.active=1
and not exists
(select 1 from statushistory h1
where h1.project_id=h.project_id and h1.date_added>h.date_added)
group by status_id
用小提琴看
当然,为了有效地运行它,您肯定需要在(project\u id,date\u added)
上建立索引,也可能需要在status\u id
上建立索引(查看它的存在是否会改变查询执行计划)
我不确定where子句中的子查询导致的低性能是否是一个神话,但这里有一个没有它的版本(部分基于的代码)。欢迎您比较这些查询,并告诉我们哪一个性能更好
select h.status_id, count(*) cnt FROM (
select project_id, max(date_added) maxdate
from statushistory
group by project_id
) h1, statushistory h, projects p
where h.project_id=h1.project_id and h.date_added=h1.maxdate
and p.project_id=h.project_id and p.active=1
group by h.status_id
在fiddle中查看是否假设max status ID是最新的
select statusID, count(1) as recordcount
from
(select project_ID, max(status_id) as statusID
from statushistory
group by project_id)a
如果该假设不正确,您需要使用max(date_added),那么可以稍微更改此逻辑以查找max(date_added),并返回以获取最近的状态。如果您想查看代码,请告诉我这是一个不相关的子查询解决方案:
SELECT h1.status_id, count(*) cnt FROM (
SELECT project_id, max(date_added) date_added FROM history
GROUP BY project_id
) h2
JOIN history h1 USING (project_id, date_added)
GROUP BY h1.status_id
小提琴
编辑:
我又一次被这个问题绊倒了。为了连接更多表,只需通过以下方式将它们添加到组上方:
SELECT h1.status_id, count(*) cnt FROM (
SELECT project_id, max(date_added) date_added FROM history
GROUP BY project_id
) h2
JOIN history h1 USING (project_id, date_added)
JOIN projects p USING (project_id)
WHERE p.active = 1
GROUP BY h1.status_id
Fiddle.状态id很可能是“1:项目已启动,2:项目已完成”类型的字典代码。这就是为什么他们想要这样一个计数。是的,我们正是这样使用它的。在仪表板中使用它可以了解每个状态下当前有多少项。啊,是的,您希望使用max(date_added)逻辑而不是max(statusID)来提高性能……MySQL及其引擎以处理以这种方式编写的子查询而闻名,非常糟糕(任何其他数据库,这都可以很好地使用)。如果您开始有更大的卷,并且您注意到性能非常差,那么罪魁祸首将是where子句中的子查询。如果我们想进一步添加一个where子句来检查projects表,那么该如何进行呢,我需要更多地了解项目表检查的性质。我们只是有一个
active
字段,我们需要检查项目是活动的还是项目。active=1Thanks Mas,我们已经测试并部署了第二个查询,它的运行速度大大加快。再次感谢您的支持!