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月的日历月中的任何时间签入,则不应在输出中显示它们。
谢谢。
答案 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