Отображение только записей, которые не имеют обновления в этом месяце - PullRequest
0 голосов
/ 18 ноября 2018

MySQL и PHP

Я пытаюсь написать оператор SQL, который позволит мне идентифицировать человека, который не проверял в этом месяце.Я застрял на том, как написать код.

У меня есть 2 таблицы

tbl_cust c tbl_attend a

    SELECT
       c.custRFID,
       a.attendID,
       a.RFID,
       a.attendDate,
       a.attendStatus,
       a.attendStatusCode,
       a.attendNotes
    FROM
       tbl_cust c RIGHT OUTER JOIN tbl_attend a ON c.custRFID = a.RFID
    WHERE
       MONTH(a.attendDate) <> MONTH(CURDATE()) AND YEAR(a.attendDate) = 
       YEAR(CURDATE())

Код отфильтровывается в этом месяце, однако он возвращаеткаждая дата до этого месяца.Я только хочу отобразить имена из таблицы с, которые не имеют записи в таблице за этот месяц.Мне не нужны все записи.

-------------------------------------------------------------
ID    RFID          Date         Time   Status    Status Code
-------------------------------------------------------------
1     01 02 03 E1   2018-01-03   1835    1        1
2     02 02 04 E2   2018-01-06   1235    1        1
3     01 02 03 E1   2018-02-07   1801    1        1
4     02 02 04 E2   2018-02-11   1109    1        1
5     01 02 03 E1   2018-03-03   1835    1        1
6     02 02 04 E2   2018-03-06   1235    1        1
7     01 02 03 E1   2018-04-07   1801    1        1
8     02 02 04 E2   2018-04-11   1109    1        1
9     01 02 03 E1   2018-05-01   1032    1        1

Если это было 16 мая 2018 года, вывод должен быть следующим:

-----------------------------------------------------------
ID    RFID          Date         Time   Status    Status Code
-------------------------------------------------------------
8     02 02 04 E2   2018-04-11   1109    1        1

Это только 2 клиента, так какфактическая таблица в конечном итоге будет иметь более 5000 клиентов.по крайней мере, 1 запись в месяц.У некоторых будет 3 из 4 записей в месяц, однако я хочу видеть только те, у которых нет записей в текущем календарном месяце.Т.е. ... если они зарегистрировались в любое время в течение календарного месяца мая 2018 года, они не должны отображаться на выходе.

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 18 ноября 2018

Если вам нужен кто-то, кто когда-либо регистрировался, то вы можете использовать агрегацию:

select RFID
from attend a
group by RFID
having max(attendDate) < date_add(curdate(), interval 1 - day(curdate()) day);
0 голосов
/ 21 ноября 2018

Вы можете сделать это, используя LEFT JOIN. Кроме того, старайтесь не использовать функции YEAR (столбец) и MONTH (столбец) в предложениях ON / WHERE, так как в этом случае SQL не сможет использовать индексы. Нечто подобное должно сработать:

SELECT
    c.custRFID,
    a.attendID,
    a.RFID,
    a.attendDate,
    a.attendStatus,
    a.attendStatusCode,
    a.attendNotes
FROM
    tbl_cust c
    LEFT JOIN tbl_attend a ON (
            c.custRFID = a.RFID
        AND a.attendDate > DATE_SUB(LAST_DAY(CURDATE()), INTERVAL 1 MONTH)
        AND a.attendDate <= LAST_DAY(CURDATE())
    )
WHERE
    a.RFID IS NULL
0 голосов
/ 18 ноября 2018

Я бы написал это как EXISTS запрос:

SELECT
   c.custRFID
FROM
   tbl_cust c
WHERE NOT EXISTS (SELECT 1 FROM tbl_attend a
                  WHERE c.custRFID = a.RFID AND
                  MONTH(a.attendDate) = MONTH(CURDATE()) AND
                  YEAR(a.attendDate) = YEAR(CURDATE()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...