【问题标题】:show one result per person sorted by date每人显示一个结果,按日期排序
【发布时间】:2018-06-12 06:19:02
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 您使用的是哪种 DBMS 产品?请为您使用的数据库产品添加标签 postgresql, oracle, sql-server, db2
  • 我正在使用 phpmyadmin 使用 mysql,这就是我所知道的:/
  • MySQL 是我们一直在寻找的神奇词汇 :-)
  • 您希望每个id 有一个单个 记录,还是希望每个日期每个id 有一个单个 记录?
  • 每个 id 的单个记录 :) 它是 dateeval 的类型日期

标签: php mysql sql phpmyadmin


【解决方案1】:

因为您分别存储了时间和日期,所以您需要执行此操作的查询相对难看。我们可以通过使用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;

Demo

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

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

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

只需将我原来的查询 dateeval 替换为上面对 STR_TO_DATE 的调用,它应该仍然有效。

【讨论】:

  • 它似乎对你有用,它对我不起作用,因为我很愚蠢,我将日期放入 varchar ......我要改变他的类型并使用你的查询,谢谢你这么多时间! PS:是的,我使用时间和日期,因为人们可以通过考试多次,因此管理员可以查看人们是否在 10 分钟内通过了 5 次而不是在一天内通过了 5 次
  • @PaulTanné 您可以在这里使用STR_TO_DATE 作为解决方法,将您的文本日期解析为真实日期。
  • 知道了,我最好用 javascript :'( :p
  • 别这么说!你是最棒的!
【解决方案2】:

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

这个查询应该会导致一个错误,但是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
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2015-01-19
    • 2015-11-20
    • 1970-01-01
    相关资源
    最近更新 更多