只显示本月没有更新的记录

bfhwhh0e  于 2021-06-19  发布在  Mysql
关注(0)|答案(3)|浏览(399)

mysql和php
我正在尝试编写一个sql语句,它将允许我识别一个本月没有签入的个人。我被困在如何写代码上。
我有两张table
客户出席会议

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())

代码在这个月过滤掉,但是它返回这个月之前的每个日期。我只想显示表c中本月没有条目的名称。我不需要所有的记录。

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

如果这是2018年5月16日,则输出如下:

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

这只使用2个客户,因为实际的表中最终将有5000多个客户。每月至少一次。有些每月会有4个条目中的3个条目,但是,我只想看到当前日历月中没有条目的条目。i、 e….如果他们在2018年5月的日历月内的任何时间签入,他们不应显示在输出上。
先谢谢你。

5cg8jx4n

5cg8jx4n1#

我会把它写成 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()));
js81xvg6

js81xvg62#

如果您希望有人曾经签入,则可以使用聚合:

select RFID
from attend a
group by RFID
having max(attendDate) < date_add(curdate(), interval 1 - day(curdate()) day);
v64noz0r

v64noz0r3#

您可以使用左连接来完成此操作。另外,尽量不要在on/where子句中使用year(column)和month(column)函数,因为在这种情况下,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

相关问题