2015-11-03 42 views
2

我在db MySQL中有表SignRegister,其中注册了对网站区域的访问权限重新注册。MySQL中一小时内分组事件

例如为:

现在我需要为同一AccountSign删除访问时,它们被包含在一个小时内和Sign值不T值。

E.g.对于AccountSign 我需要Id number 16和20删除行:

+----+------+------------+----------+-------------+ 
| id | Sign | DateSign | HourSign | AccountSign | 
+----+------+------------+----------+-------------+ 
| 18 | B | 2015-10-29 | 15:01:34 | 4041002  | 
| 19 | B | 2015-10-29 | 17:35:44 | 4041002  | 
+----+------+------------+----------+-------------+ 

对于选择那些行我曾尝试此查询:

mysql> SELECT 
    id, 
    `Sign`, 
    `DateSign`, 
    `HourSign`, 
    `AccountSign`, 
    TIMEDIFF(a.`HourSign`, b.`HourSign`) AS strDiff1 
FROM 
    SignRegister a 
JOIN SignRegister ON a.`AccountSign` = b.`AccountSign` 
AND (
    TIMEDIFF(a.`HourSign`, b.`HourSign`) BETWEEN '00:00:00' 
    AND '01:00:00' 
) 
WHERE 
`AccountSign` IN ('4041002') 
AND `Sign` IN ('B', 'L') 
AND (
    TIMEDIFF(a.`HourSign`, b.`HourSign`) BETWEEN '00:00:00' 
    AND '01:00:00' 
) 
ORDER BY 
    `DateSign`, 
    `HourSign` ASC; 

+----+------+------------+----------+-------------+----------+ 
| id | Sign | DateSign | HourSign | AccountSign | strDiff1 | 
+----+------+------------+----------+-------------+----------+ 
| 18 | B | 2015-10-29 | 15:01:34 | 4041002  | 00:00:00 | 
| 16 | L | 2015-10-29 | 15:03:29 | 4041002  | 00:00:00 | 
| 16 | L | 2015-10-29 | 15:03:29 | 4041002  | 00:01:55 | 
| 19 | B | 2015-10-29 | 17:35:44 | 4041002  | 00:00:00 | 
| 20 | B | 2015-10-29 | 17:49:22 | 4041002  | 00:13:38 | 
| 20 | B | 2015-10-29 | 17:49:22 | 4041002  | 00:00:00 | 
+----+------+------------+----------+-------------+----------+ 
6 rows in set 

在这种情况下,我必须找到ID number 16 20与strDiff1不同于00:00:00

现在尝试相同的代码与其他AccountSign,如:

mysql> SELECT 
    id, 
    `Sign`, 
    `DateSign`, 
    `HourSign`, 
    `AccountSign` 
FROM 
    SignRegister 
WHERE 
`AccountSign` IN ('4042801') 
ORDER BY 
    `DateSign`, 
    `HourSign` ASC; 


+----+------+------------+----------+-------------+ 
| id | Sign | DateSign | HourSign | AccountSign | 
+----+------+------------+----------+-------------+ 
| 83 | T | 2015-10-29 | 06:31:02 | 4042801  | 
| 85 | B | 2015-10-29 | 06:34:49 | 4042801  | 
+----+------+------------+----------+-------------+ 
2 rows in set 

在这种情况下,当它们被包含在一个小时内我不会在同一AccountSign访问删除,因为第一次访问是签署T值。

但是当我尝试选择那些行:

mysql> SELECT 
    id, 
    `Sign`, 
    `DateSign`, 
    `HourSign`, 
    `AccountSign`, 
    TIMEDIFF(a.`HourSign`, b.`HourSign`) AS strDiff1 
FROM 
    SignRegister a 
JOIN SignRegister ON a.`AccountSign` = b.`AccountSign` 
AND (
    TIMEDIFF(a.`HourSign`, b.`HourSign`) BETWEEN '00:00:00' 
    AND '01:00:00' 
) 
WHERE 
`AccountSign` IN ('4042801') 
AND `Sign` IN ('B', 'L') 
AND (
    TIMEDIFF(a.`HourSign`, b.`HourSign`) BETWEEN '00:00:00' 
    AND '01:00:00' 
) 
ORDER BY 
    `DateSign`, 
    `HourSign` ASC; 


+----+------+------------+----------+-------------+----------+ 
| id | Sign | DateSign | HourSign | AccountSign | strDiff1 | 
+----+------+------------+----------+-------------+----------+ 
| 85 | B | 2015-10-29 | 06:34:49 | 4042801  | 00:03:47 | 
| 85 | B | 2015-10-29 | 06:34:49 | 4042801  | 00:00:00 | 
+----+------+------------+----------+-------------+----------+ 
2 rows in set 

查询找到ID number 85是不被删除,因为第一SignT值。

请帮帮我。

预先感谢您。

编辑#01

对于AccountSignSignRegister我都记下来了这些访问:

+----+------+------------+----------+-------------+ 
| id | Sign | DateSign | HourSign | AccountSign | 
+----+------+------------+----------+-------------+ 
| 83 | T | 2015-10-29 | 06:31:02 | 4042801  | 
| 85 | B | 2015-10-29 | 06:34:49 | 4042801  | 
+----+------+------------+----------+-------------+ 

在这种情况下AccountSign 第一次访问有Sign等于值为T

当存在这种情况时,不需要在一个小时内删除访问,因为Sign等于T的值。

+0

“第一个isgn就是t值”在你显示它是B的例子中? – Thomas

+0

@Thomas:请在我的第一个问题中看到**编辑#01 **,谢谢, –

回答

0

添加到WHERE子句:

AND 
b.Sign IN ('B', 'L') 
AND 
a.id <> b.id 

两个“表”(左SignRegister和右SignRegister)必须在注册和记录的限制不能以自行加入(可选,为了方便)。