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

时间:2012-07-25 06:52:42

标签: mysql sql

我有两张桌子,"问题":一系列问题," 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)当使用最新的答案创建时间+超时时,它的值为3小时。

让我换一种方式。我正在寻找一个具有最低值(最后询问+超时)的问题。如果问题已被回答3次,则应使用符合条件的最新问题回答时间+超时。我希望这是有道理的。

2 个答案:

答案 0 :(得分:1)

这样的事情,但我会留给你优化:

(select q.id as id, date_add(r.created, interval q.timeout hour) as eligible
from questions q, qresults r
where q.id = r.id)
union (
select q.id as id, '1970-01-01 00:00:00' as eligible
from questions q
where q.id not in
    (select id from qresults r)
)
order by 2 asc

答案 1 :(得分:1)

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

  • 获得问题表中每个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优化器可能足够聪明,可以自己解决这个问题。