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)