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

Php 按日期排序,每人显示一个结果,php,mysql,sql,phpmyadmin,Php,Mysql,Sql,Phpmyadmin,在我的本地网站上,人们可以通过测试,管理员可以看到结果。 以前,所有的结果都是显示出来的,但很难看,所以我决定只显示最后一次通过的测试。但我被卡住了,因为我只能给每个人显示一个结果,但我不能按日期给他排序:( 这是每个人显示一个结果的查询,下面是表 它应该显示出来 654321 / 08-06-2018 / 12 : 02 / 5 / 8 / 1 A256589 / 05-06-2018 /13 : 05 / 7 / 10 / 2 谢谢!因为您分别存储了时间和日期,所以需要执行此操作的查询

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

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

它应该显示出来

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

谢谢!

因为您分别存储了时间和日期,所以需要执行此操作的查询比较难看。我们可以通过使用
ADDTIME
heuereval
时间添加到
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
的调用,它应该仍然可以工作。

因为您分别存储了时间和日期,所以需要执行此操作的查询比较难看。我们可以使用
ADDTIME
heuereval
时间添加到
dateeval
date。然后,这只是一个基本的聚合联接查询:

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\u to\u DATE
的调用,它应该仍然有效。

您所做的操作是非常错误的。您按
id
分组,但选择了所有列。由于
id
在关联数据中不是唯一的,因此这没有意义,是无效的SQL。您不能说:“给我id的
dateeval
(等)。”你必须这样说:“给我
id
最小值/最大值/平均值
dateeval

这个查询应该会导致一个错误,但是MySQL在
模式之外只能通过
模式将
select*
悄悄地转换为
select id、any_值(dateeval)、any_值(heureval).
。因此,您可以获得任意选取的值,这些值甚至可以来自不同的记录

你想要的是这样的:

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
);

您所做的是非常错误的。您按
id
进行分组,但选择了所有列。由于
id
在关联的数据中不是唯一的,因此这没有意义,是无效的SQL。您不能说:“为
id
给我
日期评估(等)。”您必须这样说:“给我id
的最小值/最大值/平均值

这个查询应该会导致一个错误,但是MySQL在
模式之外只能通过
模式将
select*
悄悄地转换为
select id、any_值(dateeval)、any_值(heureval).
。因此,您可以获得任意选取的值,这些值甚至可以来自不同的记录

你想要的是这样的:

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
);

您使用的是哪种DBMS产品?请为您正在使用的数据库产品添加一个标签:postgresql、oracle、sql server、db2i我正在使用phpmyadmin的mysql上,这就是我所知道的:/mysql是我们正在寻找的神奇词汇:-)您希望每个
id
都有一条记录,还是希望每个
id
都有一条记录,每个日期都有一条记录?每个id:)都有一条记录,并且它的日期类型是DateEvalDate,您使用的是哪个DBMS产品?请为您正在使用的数据库产品添加一个标记postgresql、oracle、sql server、db2i和phpmyadmin,即这就是我所知道的:/MySQL是我们一直在寻找的神奇词汇:-)你希望每个
id
都有一条记录,还是希望每个
id
都有一条记录,每个日期都有一条记录?每个id都有一条记录:)而且date的类型date似乎对你有用,它对我没用bcz我很愚蠢,我把日期放进了varchar……我我要更改他的类型并使用您的查询,非常感谢您的时间!PS:是的,我使用时间和日期,因为人们可以通过他想要的任何时间的考试,所以管理员可以查看人们是否在10分钟内通过了5次考试,而不是一天内通过了5次考试example@PaulTanné您可以使用
STR_TO_DATE
作为解决方法,要将文本日期解析为真实日期,我最好使用javascript:'(:P别这么说!你是最棒的!似乎对你有用,对我没用bcz我很笨,我把日期放进了varchar……我要改变他的类型并使用你的查询,非常感谢你的时间!PS:是的,我使用时间和日期是因为人们可以通过他想要的任何时间的考试,所以管理员可以查看人们是否通过了考试在10分钟内测试5次,而不是在一天内测试5次example@PaulTann你可以使用
STR_TO_DATE
作为解决方法,将文本日期解析为真实日期。明白了,我更擅长javascript:'(:p别这么说!你是最棒的!