2

「質問」の 2 つのテーブルがあります。質問のリスト、「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 回回答されている場合は、最新の質問回答時間 + タイムアウトを適格な値として使用する必要があります。これが理にかなっていることを願っています。

4

2 に答える 2

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オプティマイザがそれ自体でそれを理解するのに十分賢いかもしれないので、必要がない限り、私はこれをわざわざ行うことはしません。

于 2012-07-25T07:16:39.673 に答える
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
于 2012-07-25T07:01:53.723 に答える