2012-03-19 74 views
1

我有一個包含「用戶會話」的表,另一個表包含系統中的違規行爲。一種可能的違規行爲是讓用戶直接登錄超過12小時。使用另一個表中的數據過濾MySQL表

中的表如下:

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換句話說,我不想在同一臺主機上得到同一用戶的另一份報告,從而使得這個報告成爲可能它開始在同一時間同一違法行爲)

+1

你已經嘗試過了什麼,沒有奏效? – 2012-03-19 15:33:28

+1

SELECT username,start FROM login LEFT OUTER JOIN notification ON(login.host_id!= notification.host_id OR alert_id!= $ alert_id OR start!= event_start or username!= info)WHERE end> DATE_ADD(start,INTERVAL 12 HOUR)AND login.host_id = $ host_id AND last = 1 – hizki 2012-03-19 15:39:15

回答

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 

這個查詢應該使用「不存在」的搜索類型(試行講解),這是很好的查詢性能。 也許值得把UNIQUE KEY放在通知'host_id,event_started,info'上,並使用INSERT IGNORE

相關問題