Php 一个';重置';记录已输入

Php 一个';重置';记录已输入,php,mysql,select,Php,Mysql,Select,我在试图确定如何构造查询以允许我“重置”并仅在重置后计数记录时遇到问题 基本结构 Log Table ID | Date | Time | SectorID | personnumber 1 | 2020-02-10 | 13:23:00 | 23 | 66 (This is a row to be counted) 2 | 2020-02-10 | 13:28:00 | 38 | 66 (This is a row to be count

我在试图确定如何构造查询以允许我“重置”并仅在重置后计数记录时遇到问题

基本结构

Log Table
ID | Date        | Time     | SectorID | personnumber

1  | 2020-02-10  | 13:23:00 | 23       | 66 (This is a row to be counted)
2  | 2020-02-10  | 13:28:00 | 38       | 66 (This is a row to be counted)
3  | 2020-02-10  | 13:30:00 | 5        | 66 (This is a 'reset' row) (SectorID 5 is a reset)
4  | 2020-02-10  | 13:38:00 | 12       | 66 (This is a row to be counted)
5  | 2020-02-10  | 13:42:00 | 56       | 66 (This is a row to be counted)
对于上面的记录,有2条记录,然后重置(由扇区ID 5表示),然后再重置2条记录(其他记录可以是5以外的任何其他数字)

所以我希望“count”返回2

下面的查询是我在没有任何重置功能的情况下计算所有记录的查询

SELECT
personnumber,
count(*) as occurrences
FROM log
WHERE personnumber IS NOT NULL
AND sectorid != 5
GROUP BY personnumber
HAVING count(*) > 1
ORDER BY occurrences DESC, personnumber
这会回来的

Personnumber | Occurrences
66           | 4
我希望这能充分解释我的问题。任何帮助都将不胜感激。 谢谢
Jon

您可以通过使用
sectorId
personnumeber
加入同一个表,以便统计此id之后的所有记录:

SELECT
    l.personnumber,
    COUNT(*) as occurrences
FROM 
    `log` l
    INNER JOIN 
    (
        SELECT id, personnumber 
        FROM   `log` ll 
        WHERE  ll.sectorid = 5
    ) AS ll ON l.personnumber = ll.personnumber
WHERE 
    l.personnumber IS NOT NULL
    AND l.id > ll.id
GROUP BY l.personnumber
HAVING COUNT(*) > 1
ORDER BY 
    occurrences DESC, 
    l.personnumber
输出:

+--------------+-------------+
| personnumber | occurrences |
+--------------+-------------+
|           66 |           2 |
+--------------+-------------+
1 row in set (0.01 sec)
如果您只需要特定
personnumber
上一次出现扇区5后的记录,则需要获取派生表中的最大id:

SELECT
    l.personnumber,
    COUNT(*) as occurrences
FROM 
    `log` l
    INNER JOIN 
    (
        SELECT MAX(id) AS id, personnumber 
        FROM   `log` ll 
        WHERE  ll.sectorid = 5
        GROUP BY personnumber
    ) AS ll ON l.personnumber = ll.personnumber
WHERE 
    l.personnumber IS NOT NULL
    AND l.id > ll.id
GROUP BY l.personnumber
HAVING COUNT(*) > 1
ORDER BY 
    occurrences DESC, 
    l.personnumber

通过使用
sectorId
personnumeber
可以
JOIN
加入同一个表,以便统计此id之后的所有记录:

SELECT
    l.personnumber,
    COUNT(*) as occurrences
FROM 
    `log` l
    INNER JOIN 
    (
        SELECT id, personnumber 
        FROM   `log` ll 
        WHERE  ll.sectorid = 5
    ) AS ll ON l.personnumber = ll.personnumber
WHERE 
    l.personnumber IS NOT NULL
    AND l.id > ll.id
GROUP BY l.personnumber
HAVING COUNT(*) > 1
ORDER BY 
    occurrences DESC, 
    l.personnumber
输出:

+--------------+-------------+
| personnumber | occurrences |
+--------------+-------------+
|           66 |           2 |
+--------------+-------------+
1 row in set (0.01 sec)
如果您只需要特定
personnumber
上一次出现扇区5后的记录,则需要获取派生表中的最大id:

SELECT
    l.personnumber,
    COUNT(*) as occurrences
FROM 
    `log` l
    INNER JOIN 
    (
        SELECT MAX(id) AS id, personnumber 
        FROM   `log` ll 
        WHERE  ll.sectorid = 5
        GROUP BY personnumber
    ) AS ll ON l.personnumber = ll.personnumber
WHERE 
    l.personnumber IS NOT NULL
    AND l.id > ll.id
GROUP BY l.personnumber
HAVING COUNT(*) > 1
ORDER BY 
    occurrences DESC, 
    l.personnumber

如果在此之后还有3条记录,其中ID 6是另一个“重置”,ID 7和8是sectorID为11、人员编号为77的记录,该怎么办?您想要的结果是否只有77的计数2?或者它会有两个用于77,两个用于66?不清楚如果一个和相同的
personnumber
有两个
sectorid=5
的记录,那么输出应该是什么。如果之后还有3个记录,其中ID 6是另一个“重置”,ID 7和8是具有sectorid 11和personnumber 77的记录,该怎么办?您想要的结果是否只有77的计数2?或者它会有两个用于77,两个用于66?不清楚如果您有两个记录,其中一个记录的
sectorid=5
,并且相同的
personnumber
,那么输出应该是什么。非常感谢。我认为这显然是正确的,但我们是否能够在日期和时间字段上比较两者,因为有可能更改时间和ID不同步。如果
sectorid
可以更改(如果我做对了),那么获取下一条记录的标准应该是什么呢?
date
time
字段可以更改,因此
sectorid
5基本上可以向后移动,因此它是日期、时间驱动的,而不是idOk,并且再次-如果日期和时间发生更改(但sectorid仍然是5),那么,获取所需记录的可靠标准应该是什么?对不起,我不太理解您的意思。人号将是相同的(在这种情况下,我们试图获得66)非常感谢。我认为这显然是正确的,但我们是否能够在日期和时间字段上比较两者,因为有可能更改时间和ID不同步。如果
sectorid
可以更改(如果我做对了),那么获取下一条记录的标准应该是什么呢?
date
time
字段可以更改,因此
sectorid
5基本上可以向后移动,因此它是日期、时间驱动的,而不是idOk,并且再次-如果日期和时间发生更改(但sectorid仍然是5),那么,获取所需记录的可靠标准应该是什么?对不起,我不太理解您的意思。personnumber将是相同的(在本例中,我们尝试获得66)