MySQL:计算另一个表中字段的最新出现次数

时间:2013-10-29 16:21:22

标签: mysql sql

我有多个表来存储有关项目状态的信息。

不确定这是否可以在一个查询中进行,因为我们当前正在使用多个查询来获取此数据。

我们有项目,状态类型和状态历史表。

我正在使用的状态历史记录表主要包含project_id,status_id和date_added。

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

我需要了解目前每个阶段有多少项目。所以我需要查看每个项目并获取表中最新记录的status_id。

所以我需要返回的数据如下。

status_id    count
1            1
2            2

感谢您的帮助

3 个答案:

答案 0 :(得分:0)

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

Here it is在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

在小提琴here

中看到它

当然为了有效地运行它,你肯定需要(project_id,date_added)上的索引,也可能需要status_id上的索引(看看它的存在是否会改变查询执行计划)。

我不确定where子句中子查询引起的低性能是否是一个神话,但这里是没有它的版本(部分基于Mosty Mostacho的代码)。欢迎您比较这些查询并告诉我们哪些查询效果更好。

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

在小提琴here

中看到它

答案 1 :(得分:0)

假设最大状态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)并加入以获取最新状态。如果您想查看该代码,请告诉我

答案 2 :(得分:0)

这是一个非相关的子查询解决方案:

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

小提琴here

修改

我再次偶然发现了这个问题。要加入更多表格,您只需将它们添加到组上方:

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

小提琴here