0

店舗に 500 台のキオスクがあり、店舗 ID ごとに各プリントのタイムスタンプを追跡するテーブルがあります。プリント間の時間を秒単位で示すレコードセットを作成する必要があります。このすべてのデータは、1 つのテーブルに格納されます。印刷ごとにレコードが挿入され、ストア ID とタイムスタンプが含まれます。

テーブル名 = print
id store_id タイムスタンプ
1 1 2013-3-1 00:00:01
2 2 2013-3-1 00:00:01 *
3 3 2013-3-1 00:00:01
4 2 2013-3- 1 00:00:12 *
5 3 2013 年 3 月 1 日 00:00:06
6 2 2013 年 3 月 1 日 00:00:15 *

ストア #2 のすべての印刷の間隔を秒単位で取得する必要があります。* は、比較する必要があるレコードを簡単に見つけることができるようにするためのものです。

以下の RecordSet の結果:

id store_id myTimeDiffSeconds
2 2 0
4 2 11
6 2 3

これは、シンプルかつ高速である必要があります。一時テーブルなしでこれを行うことはできますか?

4

1 に答える 1

2

2 つの方法でクエリを作成できます
。 1. 相関クエリを使用する
2. セッション変数を使用する

最初のものはまさにethrbunnyが指摘したものです

mysql> SELECT t1.id,
          t1.store_id,
          timestampdiff(second,IFNULL( (SELECT MAX(t2.timestamp) 
                                          FROM print t2 
                                         WHERE t2.store_id=2 
                                               AND t2.timestamp< t1.timestamp)
                       ,t1.timestamp),t1.timestamp) myTimeDiffSeconds
     FROM print t1 
    WHERE t1.store_id=2 ORDER BY t1.timestamp;
+------+----------+-------------------+
| id   | store_id | myTimeDiffSeconds |
+------+----------+-------------------+
|    2 |        2 |                 0 |
|    4 |        2 |                11 |
|    6 |        2 |                 3 |
+------+----------+-------------------+
3 rows in set (0.00 sec)

もう1つの方法は、セッション変数を使用して前回の時刻を保持することですが、この場合、初めて最小タイムスタンプを取得する必要があります

mysql> select min(p.timestamp) into @prev_time from print p where p.store_id=2;
Query OK, 1 row affected (0.00 sec)

mysql> select id,
          store_id,
          timestampdiff(second,@prev_time,timestamp) myTimeDiffSeconds,
          @prev_time:=timestamp 
     from print 
    where store_id=2 order by timestamp;
+------+----------+-------------------+---------------------+
| id   | store_id | myTimeDiffSeconds | @prev_time:=t       |
+------+----------+-------------------+---------------------+
|    2 |        2 |                 0 | 2013-03-01 00:00:01 |
|    4 |        2 |                11 | 2013-03-01 00:00:12 |
|    6 |        2 |                 3 | 2013-03-01 00:00:15 |
+------+----------+-------------------+---------------------+
3 rows in set (0.00 sec)

index on (timestamp,store_id) により、クエリのパフォーマンスが向上します。

于 2013-03-27T10:25:01.430 に答える