我有多个表来存储有关项目状态的信息。
不确定这是否可以在一个查询中进行,因为我们当前正在使用多个查询来获取此数据。
我们有项目,状态类型和状态历史表。
我正在使用的状态历史记录表主要包含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
感谢您的帮助
答案 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。