2012-02-23 82 views
0

我有一个MySQL表(可惜没有图片的第一篇文章)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。

我有高级一刻试图获得每个团队的最后一项。请有人把我的骨头扔给我咀嚼。

+1

也许数据类型需要使用'GROUP BY tlog.team_id'? – ArVan 2012-02-23 08:38:31

+0

尝试使用'SELECT * FROM tlog WHERE gridref!=''AND team_id!= 0 ORDER BY tlog.entry_date DESC GROUP BY tlog.team_id;' – Pateman 2012-02-23 08:42:06

+1

你是什么意思_“获取每个团队的最后一个条目”_? – CodeCaster 2012-02-23 08:42:38

回答

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) 

显然,对于这一点,你可能需要转换到支持级联

+0

嗯,试着让我得到了和我一样的结果。我会继续玩,看看我怎么走。 – tastech 2012-02-24 08:17:02

+0

对不起,意识到你有重复的日期。已更新查询 – kaj 2012-02-24 08:49:10

+0

Aaahhh,现在我们正在接近,但有记录没有team_id或没有gridref。所以我想过滤掉所有没有team_id或gridref为空的记录,只显示每个team_id> 0且gridref不为空的最后记录(!='')。 – tastech 2012-02-24 10:30:08

0

也许会有这样的帮助:

SELECT MAX(entry_date) FROM `tlog` WHERE gridref != '' AND team_id != 0 GROUP BY team_id 
+0

尽管如此,这并不能提供最后的输入。 – tastech 2012-02-24 07:50:24

0

只是存储在datetime或INT(时间戳)列中的日期和时间。是的,可以这样做,但是你没有获利,而是有问题。

修复此问题在视图层。如果用户在输入日期时出错,请使用javascript日历控件并让他们选择日期和时间。

如果这是不可能的,那么使用strtotime()和一些字符串连接来解析输入。

+0

带时间戳的问题是可能无序地输入条目,并且可能在2-3天后输入,所以在这种情况下按时间戳排序不起作用。 – tastech 2012-02-24 07:49:10

+0

@ user1227400 timestamp列不必填充_current_时间戳。 – CodeCaster 2012-02-24 08:49:47

+0

是的,我知道,但由于某些管理方面的原因,我无法使用组合的日期/时间字段。 – tastech 2012-02-24 10:21:03