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 events ( 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 回答