首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅显示本月没有更新的记录

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

Stack Overflow用户
提问于 2018-11-18 10:08:21
回答 3查看 61关注 0票数 1

MySQL和PHP

我正在尝试编写一条SQL语句,该语句将允许我识别本月未签到的个人。我被困在如何写代码上了。

我有两张桌子

tbl_cust c tbl_attend a

代码语言:javascript
复制
    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中没有条目的名字。我不需要所有的记录。

代码语言:javascript
复制
-------------------------------------------------------------
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日,则输出应如下:

代码语言:javascript
复制
-----------------------------------------------------------
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月的日历月份内随时签入,则不应在输出中显示。

提前谢谢你。

EN

回答 3

Stack Overflow用户

发布于 2018-11-18 12:20:52

如果你想要一个曾经签到过的人,那么你可以使用聚合:

代码语言:javascript
复制
select RFID
from attend a
group by RFID
having max(attendDate) < date_add(curdate(), interval 1 - day(curdate()) day);
票数 1
EN

Stack Overflow用户

发布于 2018-11-18 10:27:34

我将把它写成一个EXISTS查询:

代码语言:javascript
复制
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()));
票数 0
EN

Stack Overflow用户

发布于 2018-11-21 10:30:15

您可以使用LEFT JOIN来完成此操作。另外,尽量不要在ON/WHERE子句中使用YEAR(column)和MONTH(column)函数,因为在这种情况下SQL将不能使用indeces。下面这样的代码应该能起到作用:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53357295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档