我有一个mysql表(可惜第一篇文章没有图片)
Team_id,entry_date, entry_time,gridref
"20","2011-12-14","10:21:00","496218"
"20","2011-12-14","10:43:02","349217"
"21","2011-12-14","10:48:00","351213"
"22","2011-12-14","11:58:00","327216"
"22","2011-12-14","11:21:00","328214"
"23","2011-12-14","11:33:00","351210"
"23","2011-12-14","10:42:11","350210"
"23","2011-12-14","11:11:00","350208"
"24","2011-12-14","10:39:00","329209"
"24","2011-12-14","11:40:00","328211"
"27","2011-12-14","11:04:31","344226"
"29","2011-12-14","11:32:58","328208"
获取此功能的SQL是
SELECT team_id, entry_date, entry_time, gridref
FROM `tlog`
WHERE gridref != ''
AND team_id != 0
AND (entry_date = (SELECT MAX(entry_date) FROM `tlog`))
ORDER BY `tlog`.`team_id` ASC
在几天内有相当多的数据,每个团队的条目可以按任何顺序进行,而不是在信息发布时(如果可以在一天之后输入)。用户试图输入yyyy-mm-mm hh:mm格式时遇到问题,因为他们错过了空格和字符。所以单独的日期和时间内容已经解决了这个问题。
还有一些与团队无关或没有gridref的条目。但是每个条目都有一个entry_date和entry_time。 entry_date的MySQL格式为DATE,entry_time为TIME。
我有一个高级时刻试图获得每个团队的最后一个条目。有人可以给我一块骨头来咀嚼。
答案 0 :(得分:0)
也许这样的事情会有所帮助:
SELECT MAX(entry_date) FROM `tlog` WHERE gridref != '' AND team_id != 0 GROUP BY team_id
答案 1 :(得分:0)
只需将日期和时间存储在datetime或int(timestamp)列中。是的,它可以这样做,但你没有获利,而是问题。
在视图层修复此问题。如果用户在键入日期时出错,请使用javascript日历控件并让他们选择日期和时间。
如果那是不可能的,那么使用strtotime()
和一些字符串连接来解析输入。
答案 2 :(得分:0)
您需要获得每个团队的最长日期,然后在子查询中获得每个团队的最长时间,然后加入有关团队ID,日期和时间的外部查询:
select t.teamid, t.entryDate, t.entryTime, t.gridRef
from tlog t
inner join (select t2.teamid, med.ed, max(entryTime) et from tlog t2
inner join (select teamid, max(entryDate) ed from tlog where teamid > 0 and gridRef <> '' group by teamid) med on med.teamid = t2.teamid and med.ed = t2.entryDate group by t2.teamid, med.ed) met on met.teamid = t.teamid and met.ed = t.entryDate and met.et = t.entryTime
尝试构建这样的查询只需要完成逻辑步骤,即首先需要每个团队的最新日期 - 编写一个实现该目标的查询。那么你需要每个日期的最新时间。然后找到与那些相匹配的细节。如果有助于使其更清晰,请使用临时表。
请注意,您不能只有一个子查询max(entryDate)和max(entryTime),因为最新时间不一定是最近的日期。
如果MySQL支持并且您只需要一个子查询,则需要将日期和时间连接在一起,例如
max(entryDate + ' ' + entryTime)
显然,您可能需要转换为支持连接的数据类型