2012-03-19 4 views
1

"사용자 세션"이 포함 된 테이블 하나와 시스템에서 위반을 나타내는 테이블 하나가 있습니다. 한 가지 가능한 위반은 사용자가 12 시간 이상 연속해서 로그온하는 것입니다.다른 테이블의 데이터를 사용하여 MySQL 테이블 필터링

테이블은 따른다 같이 I 결과 테이블 원하는

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, 일단 시작> + 12시간
하고 전에이 인스턴스를보고하지 않았는지 확인하십시오.
login.host_id! notification.host_id, notification.alert_id! = Y, login.start! = notification.event_start, login.username! = notification.info
(in 다른 말로하면, 동일한 호스트에 대해 동일한 사용자의 다른 보고서를 얻고 싶지는 않습니다. 이 쿼리는 쿼리 성능 좋은 인 (EXPLAIN 시도) "존재하지"검색의 종류 사용해야

+1

이미 작동하지 않은 것은 무엇입니까? –

+1

SELECT 사용자 이름, 로그인으로 시작 LEFT OUTER JOIN 알림 ON (login.host_id! = 알림 호스트 ID 또는 alert_id! $ alert_id 또는 시작! = event_start 또는 사용자 이름! = 정보) 끝> DATE_ADD (시작, 간격 12 시간) AND login.host_id = $ host_id AND last = 1 – hizki

답변

2
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 

동시에 시작 같은 위반). 아마도 'host_id, event_started, info'알림에 UNIQUE KEY를 넣고 INSERT IGNORE를 사용하는 것이 가치가 있습니다.

관련 문제