-1

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

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

我们有项目、状态类型和状态历史的表格。

我正在使用的状态历史表主要由 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

谢谢你的帮助

4

3 回答 3

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

在这里拉小提琴。

编辑:

我刚刚又偶然发现了这个问题。为了加入更多表格,您只需通过以下方式将它们添加到组上方:

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

在这里拉小提琴。

于 2013-10-29T16:42:38.077 回答
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) 并返回以获取最新状态。如果您想查看该代码,请告诉我

于 2013-10-29T16:31:45.627 回答
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

这是在 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_id,date_added),也许status_id也需要打开索引(看看它的存在是否会改变查询执行计划)。

我不确定 where-clause 中的子查询导致的低性能是否是一个神话,但这里有一个没有它的版本(部分基于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

在这里看小提琴

于 2013-10-29T16:28:00.707 回答