我需要在表格位置返回每个设备的最后一行
我的表名是:位置
+------------+----------+--------------+--------------+----------+
| locationId | deviceId | dataRegistro | horaRegistro | location |
+------------+----------+--------------+--------------+----------+
| 50 | 1 | 2012-11-07 | 15:35:00 | A12 |
+------------+----------+--------------+--------------+----------+
| 51 | 1 | 2012-11-07 | 15:37:40 | B2 |
+------------+----------+--------------+--------------+----------+
| 52 | 2 | 2012-11-07 | 15:35:12 | B8 |
+------------+----------+--------------+--------------+----------+
| 53 | 2 | 2012-11-07 | 15:35:40 | 50C |
+------------+----------+--------------+--------------+----------+
| 54 | 2 | 2012-11-07 | 15:40:00 | 94A |
+------------+----------+--------------+--------------+----------+
Run Code Online (Sandbox Code Playgroud)
从我选择的一个设备的最后一行中选择
select L from Location L where deviceId = :deviceId order by "dataRegistro" DESC, "horaRegistro" DESC limit 1
现在如何选择每个设备的所有最新位置?:(我使用Java JPA.
谢谢,
伊万德罗
如果ID是有序的,那么后面记录的记录对应于以后的日期,你可以使用这个查询(我不打算将字符串转换为日期,这会使它慢于可接受的.):
select L from Location L where deviceId = :deviceId order by L.locationId DESC
Run Code Online (Sandbox Code Playgroud)
并限制在Java代码中返回的行数:
//EntityManager em; defined earlier
Query q = em.createQuery("select L from Location L where deviceId = :deviceId order by L.locationId DESC ");
q.setParameter("deviceId", "theDeviceIdIWantToQuery");
q.setMaxResults(1);
List<Location> results=query.getResultList();
Run Code Online (Sandbox Code Playgroud)
如果没有给定deviceId的行,或者包含1个Location项的List - 最后一个,则这将是一个空列表.
如果要一次性为所有设备选择最新位置,可以使用IN子句和子查询:
select L2 FROM Location L2 WHERE L2.locationId IN
(select L.locationId from Location L
where L.deviceId = :deviceId
order by L.locationId DESC
group by L.deviceId)
Run Code Online (Sandbox Code Playgroud)
遗憾的是,JPQL不允许在FROM子句中使用子查询,因此虽然这是我选择这样做的,但只能使用本机查询功能,这样使用起来会更加不方便.
顺便说一句,在我看来,像你这样存储时间戳是一种不好的做法.它没有正确的可索引性,在查询和订购时会给您带来麻烦,只是一场普通的噩梦.我会认真重新考虑你的架构的这一部分.
| 归档时间: |
|
| 查看次数: |
7805 次 |
| 最近记录: |