MySQL PHP способ подсчета после ввода записи сброса - PullRequest
1 голос
/ 10 февраля 2020

У меня возникают проблемы при попытке понять, как структурировать мой запрос так, чтобы он мог «сбрасывать» и подсчитывать записи только после того, как произошел сброс.

Основа c Структура

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 записи, затем произошел сброс (который обозначен идентификатором сектора, равным 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

Надеюсь, это достаточно объяснит мою проблему. Любая помощь приветствуется. Спасибо Джон

1 Ответ

0 голосов
/ 10 февраля 2020

Вы можете JOIN той же таблицы, используя sectorId и personnumeber для подсчета всех записей после этого идентификатора:

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)

Если вам нужны только записи после последнего вхождения сектора 5 для конкретного personnumber, то вам нужно получить максимальный идентификатор в производной таблице:

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
...