Фильтрация таблицы MySQL по данным из другой таблицы - PullRequest
1 голос
/ 19 марта 2012

У меня есть одна таблица, содержащая «сеансы пользователя», а другая - для указания нарушений в системе.Одним из возможных нарушений является то, что пользователь вошел в систему более 12 часов подряд.

Таблицы приведены ниже:

notification:
+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| id           | int(11)     | NO   | PRI | NULL    | auto_increment |
| host_id      | int(11)     | NO   | MUL | NULL    |                |
| alert_id     | int(11)     | NO   | MUL | NULL    |                |
| event_start  | datetime    | NO   |     | NULL    |                |
| time_noticed | datetime    | NO   |     | NULL    |                |
| info         | varchar(45) | YES  |     | NULL    |                |
| seen         | int(11)     | NO   |     | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+

login:
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(45) | NO   |     | NULL    |       |
| host_id  | int(11)     | NO   | MUL | NULL    |       |
| start    | datetime    | NO   |     | NULL    |       |
| end      | datetime    | NO   |     | NULL    |       |
| last     | int(11)     | NO   |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+

Условия, которые я хочу получить для таблицы результатов:
login.last = 1, login.host_id = X, end> ​​start + 12hours
и чтобы убедиться, что я не сообщал об этом ранее:
login.host_id! =tification.host_id ,tification.alert_id! =Да, login.start! = Notification.event_start, login.username! = Notification.info
(другими словами, я не хочу получать другой отчет того же пользователя на том же хосте, совершая то же нарушениекоторый начался одновременно)

1 Ответ

2 голосов
/ 19 марта 2012
SELECT DISTINCT username, start 
FROM login 
LEFT OUTER JOIN notification ON 
    (login.host_id = notification.host_id 
    AND login.start = notification.event_start
    AND login.username = notification.info) 
WHERE 
    end>DATE_ADD(start,INTERVAL 12 HOUR) 
    AND login.host_id=$host_id 
    AND last=1 
    AND login.id IS NULL

В этом запросе должен использоваться поиск типа «не существует» (попробуйте EXPLAIN), что хорошо для производительности запроса. может быть, стоит поставить UNIQUE KEY на уведомление 'host_id, event_started, info' и использовать INSERT IGNORE

...