我有两张桌子,"问题":一系列问题," 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次,则应使用符合条件的最新问题回答时间+超时。我希望这是有道理的。
答案 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)
我现在无法检查语法,但我会做这样的事情。
语法会像......
语法更新
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优化器可能足够聪明,可以自己解决这个问题。