Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:计算另一个表中字段的最新出现次数_Mysql_Sql - Fatal编程技术网

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

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\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-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,我们已经测试并部署了第二个查询,它的运行速度大大加快。再次感谢您的支持!