显示一个结果,每个人按日期排序

yptwkmov  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(250)

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

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

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

它应该显示

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

谢谢您!

41zrol4v

41zrol4v1#

因为时间和日期是分开存储的,所以需要执行的查询相对来说比较难看。我们可以使用 ADDTIME 添加 heuereeval 时间到了 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;

演示

为便于将来参考,请避免将日期和时间分开存储,除非有很好的理由这样做(我在这里没有看到)。
编辑:我担心的是,根据评论,你似乎已经将日期存储为文本。可以使用以下函数调用根据日期文本生成日期:

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

只需替换原始查询中的 dateeval 与上述通话 STR_TO_DATE 它应该还能用。

gtlvzcf8

gtlvzcf82#

你所做的是非常错误的。您分组依据 id ,但您选择了所有列。作为 id 在联接数据中不是唯一的,这毫无意义,是无效的sql。你不能说:“把钥匙给我 dateeval (等) id ". 你必须这样说:“给我最小值/最大值/平均值 dateeval 对于 id ".
此查询应该会导致错误,但是 ONLY_FULL_GROUP_BY 让我们悄悄地改变这个模式 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
);

相关问题