gpt4 book ai didi

mysql - 按创建时间+超时排序,MySQL

转载 作者:行者123 更新时间:2023-11-29 02:32:03 39 4
gpt4 key购买 nike

我有两个表,“问题”:问题列表,“QResults” 用户对这些问题的结果。在再次询问问题之前,这些问题会在数小时内超时。

Table: Questions
ID
Timeout - The amount of time before asking the question again

Table: Results
ID
Created (timestamp) - When this record was added.
Questions_ID - A FK to the Question table

示例数据

Table: Questions
ID | Timeout (hrs)
--------------
1 | 1
8 | 6
15 | 1
55 | 1

Table: QResults
ID | Created | Q_ID
-------------------------------
1 | Jan 24, 2012 00:00 | 1
2 | Jan 24, 2012 06:05 | 15
3 | Jan 24, 2012 02:00 | 8
4 | Jan 24, 2012 01:00 | 1
5 | Jan 24, 2012 02:00 | 1

我正在寻找的是一个查询,它将根据上次回答问题的时间 + 超时对问题进行排序。如果问题从未得到回答,那么它应该被推到列表的顶部。

例如,如果对上述数据运行查询,它将产生以下数据集。

The result of the query I am looking for. 
ID | timeout + created aka eligible
-------------------------------
55 | Jan 01, 1970 01:00 *(1) See note below*
1 | Jan 24, 2012 03:00 *(2) See note below*
8 | Jan 24, 2012 07:05
15 | Jan 24, 2012 08:00

*注意:(1) id=55 的日期是什么并不重要,只要它先出现即可。因为目前没有它的 QResults。 (2) 这具有 3hr 的值,因为它使用最新的答案创建时间 + 超时。

让我换一种说法。我正在寻找具有最低值的问题(上次提问 + 超时)。如果问题已被回答 3 次,则应使用最新的问题回答时间 + 超时作为合格值。我希望这是有道理的。

最佳答案

我现在无法检查语法,但我会这样做。

  • 为您的问题表中的每个 ID 获取最低记录
  • 将结果表中的所有记录加上问题表中的超时记录附加到这些记录
  • 通过ID获取结果的最大值

语法类似于...

更新语法

select ID, MAX(Timeout) as Timeout
from
(
(
select ID, cast('1970-01-01 01:00' as DATETIME) as Timeout
from Questions
)
union all
(
select q.ID, r.created + INTERVAL q.Timeout hour as Timeout
from QResults as r, Questions as q
where r.q_ID=q.ID
)
) c
group by ID
order by MAX(Timeout) asc

这给了我以下结果。 (请注意与您的顺序不同。我认为这就是您的意思。)

ID  Timeout
55 1970-01-01 01:00:00
1 2012-01-24 03:00:00
15 2012-01-24 07:05:00
8 2012-01-24 08:00:00

如果运行缓慢,您可能希望在加入问题表以添加超时之前通过 Qresults 表中的 id 获取最大日期。除非你需要,否则我不会费心这样做,因为它会使查询复杂化,而且 mysql 优化器可能足够聪明,可以自己解决这个问题。

关于mysql - 按创建时间+超时排序,MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11644173/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com