0

単純な問題のように見えますが、苦労しています。以下のように2つのテーブルがあります。

テーブル 1 には、部屋のイベントと時間 (秒) が含まれています テーブル 2 には、部屋へのアクセス時間 (秒) と人の名前があります

テーブル1のすべての行について、最後に部屋に入った人を出力したいのですが、最後の5分間に部屋に入った場合に限ります

time は両方のテーブルのプライマリ インデックスです

表1の例(イベント)

|time      |event|
|1294427839|poff |
|1294427939|pofn |
|1294428839|poff |

表 2 の例 (エントリ)

|time      |name|
|1294427829|tpeters |
|1294427929|jsmith |
|1294428829|abeach |

テーブル 1 には約 5,000 行、テーブル 2 には約 300,000 行があります。現在、次のクエリを使用していますが、完了するまでに数分かかります。誰かが私が間違っていることを教えてください。

select (SELECT name FROM entries entries WHERE entries.time > events.time-300 and  entries.time < events.time order by entries.time desc limit 1) from events events

どんな助けでも大歓迎です。

詳細を追加:

ID  SELECT_TYPE        TABLE    TYPE    POSSIBLE_KEYS   KEY     KEY_LEN     ROWS    FILTERED    EXTRA
1   PRIMARY            events   index                   PRIMARY 8           3       100     Using index
2   DEPENDENT SUBQUERY entries  index   PRIMARY         PRIMARY 8           1       300     Using where

CREATE TABLE イベント ( timeint(11) NOT NULL DEFAULT '0', PRIMARY KEY ( time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

CREATE TABLE エントリ ( timeint(11) NOT NULL DEFAULT '0', PRIMARY KEY ( time) )ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

4

1 に答える 1

1

これを試してみてください

SELECT name, ev_time, en_time
FROM (
  SELECT
    name,
    IF(events.time = @last_time, 0, 1) AS last,
    @last_time := events.time AS ev_time,
    entries.time AS en_time
  FROM events
  LEFT JOIN entries ON (entries.time BETWEEN events.time-300 AND events.time)
  ORDER BY events.time, entries.time
) as tmp
WHERE last = 1

sqlfiddleでテストしました

于 2012-07-19T23:42:23.227 に答える