我找不到正确的记录。我的位置表记录了一台设备的位置历史。因此,移动的最新日期将是其当前位置。位置表目前由2258条记录组成(“state_tag”是FK)。在我的设备表中,我有2050个设备,每个设备都有一个唯一的“状态标签”编号(PK)。所以,我想查询位置表,得到所有设备的当前位置(即MAX(移动日期)。查询将返回2050条记录。
按照上一篇文章的示例,我尝试了以下查询:
SELECT * FROM its_locations WHERE date_moved in (SELECT MAX(date_moved) FROM its_locations GROUP BY state_tag);
但是,查询返回2257条记录,而应该返回2050条记录。很明显,我的查询完全按照编写的那样执行,但不是按需要执行(lol)。
我还尝试了下面的查询,该查询提供了2050条记录,但只返回每个组的第一条记录,并将组的最大日期插入到该记录中,该记录很可能不是当前位置。
SELECT state_tag, MAX(date_moved) AS "Date Moved", building, room, staff, commentsFROM its_locationsGROUP BY state_tag;
请帮助我回答正确的问题。
非常感谢提前。
克里斯

最佳答案

这是您的问题:

SELECT *
FROM its_locations
WHERE date_moved in (SELECT MAX(date_moved) FROM its_locations GROUP BY state_tag)

子查询计算所有位置的最大值date_moved。然后它返回任何具有这些日期的位置。因此,两个位置可能在同一日期移动,一个是最大日期,并且两者都返回。
您需要的是相关子查询,而不是group by
SELECT l.*
FROM its_locations l
WHERE date_moved = (SELECT MAX(l2.date_moved)
                    FROM its_locations l2
                    WHERE l2.state_tag = l.state_tag
                   );

如果原始表有重复项,则可能仍会得到2050多行。但这可能会解决你的问题。

关于mysql - 具有聚合功能的子查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34070370/

10-14 16:00
查看更多