Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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 在GROUPBY语句中使用最近的创建日期_Mysql_Sql_Greatest N Per Group - Fatal编程技术网

Mysql 在GROUPBY语句中使用最近的创建日期

Mysql 在GROUPBY语句中使用最近的创建日期,mysql,sql,greatest-n-per-group,Mysql,Sql,Greatest N Per Group,我有一个发票系统,并试图生成关于所花时间的报告。我正在保存订单更改的每个实例,因此每个发票上几乎每个项目都有多个条目。因此,我正在过滤掉旧的更改,并尝试只使用最新的更改 共享项目id、阶段id和相同weekstart的每个实例都是发票上的同一项。我想生成一个报告,只获取这些项目的最新版本 示例表: id project_id phase_id weekstart created -----------------------------

我有一个发票系统,并试图生成关于所花时间的报告。我正在保存订单更改的每个实例,因此每个发票上几乎每个项目都有多个条目。因此,我正在过滤掉旧的更改,并尝试只使用最新的更改

共享项目id、阶段id和相同weekstart的每个实例都是发票上的同一项。我想生成一个报告,只获取这些项目的最新版本

示例表:

    id       project_id      phase_id        weekstart     created
    ---------------------------------------------------------------
    1        6               apple         2017-04-20    2017-04-23
    2        6               apple         2017-04-20    2017-04-24
    3        8               banana        2017-04-20    2017-04-23
    4        9               pear          2017-04-20    2017-04-23
    5        9               pear          2017-04-20    2017-04-25
我希望能够运行查询以获取:

    id       project_id      phase_id        weekstart     created
    ---------------------------------------------------------------
    2        6               apple         2017-04-20    2017-04-24
    3        8               banana        2017-04-20    2017-04-23
    5        9               pear          2017-04-20    2017-04-25
目前,我正在使用类似于:

SELECT * from invoiceitems where employee_id = 10 
group by project_id, phase_id, weekstart 
但这不包括创建日期


对结果排序对GROUPBY语句没有任何影响。我已经检查过类似的帖子,但我发现只有两个帖子希望按最早的创建日期排序,或者没有按多个列对结果进行分组

连接到一个子查询,该子查询查找每个项目的最新创建时间。请注意,我们在这里使用GROUPBY,但仅在子查询中使用GROUPBY来聚合项目

SELECT t1.*
FROM invoiceitems t1
INNER JOIN
(
    SELECT project_id, phase_id, MAX(created) AS max_created
    FROM invoiceitems
    GROUP BY project_id
) t2
    ON t1.project_id = t2.project_id AND
       t1.phase_id   = t2.phase_id
       t1.created    = t2.max_created
测试和工作完美


您可以发布您正在使用的查询的结果吗?SELECT*在GROUP BY查询中不是有效的SELECT子句。GROUPBY查询不会从表中返回行,而是动态生成它放在记录集中的行;对于每个生成的行,它使用从查询中提取的一组行。一个组中有多个id值,因为id不在GROUPBY子句中,这就是SELECT子句中的id不明确的原因。分组查询并不能解决您的问题。@axiac这只是冰山一角。看看类似的问题。我认为阶段也需要改进considered@Strawberry你可能是对的,但是,鉴于提供的样本数据似乎没有揭示这一点,我不会更改我的查询,除非OP留下一条评论,确认您的预感。phase_id确实需要包括在内。还有weekstart。我可以把这三个都分组吗?我在逻辑中添加了相位id。如果逻辑需要,也可以添加weekstart。不能保证MAXid和MAXcreated返回原始表上同一行上的值。此外,当您按项目id分组并选择阶段id时,如果有两行具有相同的项目id但阶段id不同,则服务器会停止。您的查询结果是不确定的。根据问题,我认为id是一个自动递增列,最新创建的日期很可能具有更高的id,而且我在问题中看到的是,项目id和阶段id之间似乎有某种关系,这就是为什么6代表苹果,9代表梨。我认为您不应该对某人的努力投反对票。你应该看看问题是什么,问了什么……你做了很多假设,忽略了问题中的信息。它说,每个实例共享一个项目id、阶段id和相同的weekstart都是发票上的同一项-您的答案中完全缺少具有相同项目id、阶段id和weekstart的部分。从这个角度来看,问题中发布的查询,即使是不正确的,也会生成比您更正确的结果。
SELECT MAX(`id`) as `id`, `project_id`, `phase_id`, 
`weekstart`, MAX(`created`) as `created` 
FROM `invoiceitems` 
GROUP BY `project_id` 
ORDER BY `project_id` ASC