如何在mysql中获取每天的最后一条记录?

8
我想获得mysql中每天的最后一条记录。 Location<id,date,place_id>表在每天都有多个条目。该Location表具有place_id和插入place_id的时间。
还要考虑如果没有place_id,则返回具有place_id的第二个最后记录。 在下表中,对于NULL,'2016-04-06 18:52:06'记录,我们返回'13664','2016-04-06 12:57:30',它是“2016-04-06”(3月6日)上的倒数第二个记录,并且具有place_id。
还有一件事,在单个日期上,会有更多的place_id,请看下面的表格。
   id  ||  place_id || date
   '1',   '47', '2016-04-05 18:09:37'
   '2',   '48', '2016-04-05 12:09:37'
   '3',   '13664', '2016-04-06 12:57:30'
   '4',   '9553', '2016-04-08 10:09:37'
   '5',   NULL, '2016-04-06 18:52:06'
   '6',   '9537', '2016-04-07 03:34:24'
   '7',   '9537', '2016-04-07 03:34:24'
   '8',   '656', '2016-04-07 05:34:24'
   '9',   '7', '2016-04-07 05:34:57'

当我运行以下查询时,它返回以下结果:
查询:我运行了以下查询,但是它给出了错误的结果。
`Location<id, place_id, date>`

select L1.place_id, L1.date from 
     Location1 L1 
Left join
     Location1 L2
on 
     Date(L1.date) = Date(L2.date)
And
    L1.date < L2.date
where 
    L2.date is null

group by L1.date;

Result I want:

 id....place_id ........date   
   '1',   '47',      '2016-04-05 18:09:37'    
   '3',   '13664',   '2016-04-06 12:57:30'  
   '4',   '9553',    '2016-04-08 10:09:37'   
   '9',   '7',       '2016-04-07 05:34:57'
3个回答

8
你可以尝试一下:
SELECT 
L.id,
L.place_id,
L.date
FROM Location L
INNER JOIN 
(
  SELECT 
   MAX(date) max_time
  FROM Location
  GROUP BY Date(`date`)
) AS t
ON L.date = t.max_time

SQL FIDDLE DEMO

SQL FIDDLE DEMO2

[基于您期望的输出结果]


我已经在 SQL Fiddle 中修改了查询。请检查一下。 - 1000111
2
太好了。看起来很不错。在我用我的数据库进行测试后,我会接受你的答案,并给你点赞... - Guest
你可以选择是否需要与 place_id 相对应的 id。如果你需要与 place_id 相对应的 id,那么你可以使用 SQL FIDDLE DEMO2。或者,如果你需要与 max_date 字段相对应的 id,那么你可以使用 SQL FIDDLE DEMO - 1000111
查询不应该返回所有的place_ids。@HerpaMoTeH - 1000111
比较 DEMO 1 中的 id 字段与您的要求,以及 DEMO 2 中的 id 字段与您的要求。 - 1000111
显示剩余2条评论

2

你可以尝试以下查询:

SELECT * FROM `Location` GROUP BY DATE(`date`) ORDER BY `date` DESC

这个查询的作用是按照日期降序分组,并显示每个日期的一行记录。
获取最后一条记录:
SELECT * FROM `Location` ORDER BY `date` LIMIT 1;

获取最后一个没有 null 值的记录:
SELECT * FROM `Location` WHERE place_id IS NOT NULL ORDER BY `date` LIMIT 1;

获取所有不为空的地点记录:
SELECT * FROM `Location` WHERE place_id IS NOT NULL GROUP BY `place_id` ORDER BY `date` DESC

最后一条记录 - 就像只有一条记录,最后输入的那一条? - HerpaMoTeH
我已经编辑了我的答案,请看最后一个查询,它可以快速完成任务并为您提供所有place_ids的信息。 - HerpaMoTeH

0

这个可以工作吗?

select place_id, max(date) as MaxDate
from foo
where place_id is not NULL
group by place_id

1
在单个日期内,可能会有多个place_id,因此您不能按place_id分组,也不能使用max,因为我想要相应日期的place_id... - Guest

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接