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

时间:2018-11-18 02:08:21

标签: mysql sql

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

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

-------------------------------------------------------------
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个客户,因为实际表最终将有5,000个以上的客户。每月至少有1个条目。有些会每月有4个条目中的3个,但是,我只希望看到那些在当前日历月中没有条目的条目。即...如果他们在2018年5月的日历月中的任何时间签入,则不应在输出中显示它们。

谢谢。

3 个答案:

答案 0 :(得分:1)

如果您想要曾经签到过的人,则可以使用聚合:

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

答案 1 :(得分:0)

我将其写为currentDate: string = new Date().toLocaleString();查询:

EXISTS

答案 2 :(得分:0)

您可以使用LEFT JOIN执行此操作。 另外,尽量不要在ON / WHERE子句中使用YEAR(column)和MONTH(column)函数,因为在这种情况下SQL将无法使用indes。 这样的事情应该可以解决问题:

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