显示每个按日期排序的结果

时间:2018-06-12 06:19:03

标签: php mysql sql phpmyadmin

在我的本地网站上,人们可以通过测试,管理员可以看到结果。 之前,所有的结果都显示出来但很难看,所以我决定只显示人们通过的最后一次测试。但我被困了,因为我每人只能显示一个结果,但我不能按日期对他进行排序:(

SELECT * FROM resultateval join personne using (id) group by id

这是每个人显示一个结果的查询,这是表格。

enter image description here

它应该显示

654321 / 08-06-2018 / 12 : 02 / 5 / 8 / 1
 A256589 / 05-06-2018 /13 : 05 / 7 / 10 / 2

谢谢!

2 个答案:

答案 0 :(得分:3)

由于您分别存储时间和日期,因此您需要执行此操作的查询相对较难。我们可以使用ADDTIMEheuereeval时间添加到dateeval日期,从而形成有效的时间戳。然后,这只是一个基本的聚合连接查询:

SELECT t1.*
FROM resultateval t1
INNER JOIN
(
    SELECT id, MAX(ADDTIME(dateeval, heureeval)) AS max_date
    FROM resultateval
    GROUP BY id
) t2
    ON t1.id = t2.id AND
       ADDTIME(t1.dateeval, t1.heureeval) = t2.max_date;

enter image description here

Demo

为了将来参考,请避免单独存储日期和时间,除非有充分的理由这样做(我在这里看不到)。

编辑:我担心,根据评论,您似乎已将日期存储为文字。您可以使用以下函数调用根据日期文本生成日期:

STR_TO_DATE(dateeval, '%d-%m-%Y')

只需将原始查询dateeval替换为STR_TO_DATE的上述调用,它仍应有效。

答案 1 :(得分:1)

你在做什么是非常错误的。您按id分组,但是您选择了所有列。由于id在您加入的数据中不是唯一的,因此这没有任何意义,并且是无效的SQL。你不能说:“为dateeval”提供 id(等)。您必须说出以下内容:“”为dateeval“提供最低/最高/平均 id

这个查询应该会导致错误,但是ONLY_FULL_GROUP_BY模式之外的MySQL会让这个问题滑落,然后默默地将select *转换为select id, any_value(dateeval), any_value(heureeval) ...。因此,您可以获得任意选择的值,甚至可以来自不同的记录。

你想要的是这样的:

select *
from resultateval 
join personne using (id)
where (id, timestamp(dateeval,heureeval)) in
(
  select id, max(timestamp(dateeval,heureeval)) 
  from resultateval 
  join personne using (id)
  group by id
);