我想加入四个表并获取超过30天的记录。我想我做得很好,但不是在30天以前。
它返回空结果。我的问题:
SELECT b.accountid,
a.memberid,
c.id,
d.memberid AS uid,
d.datecreated
FROM `tbl_members` c
LEFT JOIN `table1` b
ON c.`id` = b.`accountid`
LEFT JOIN `table2` a
ON b.`accountid` = a.`memberid`
LEFT JOIN `table3` d
ON a.`id` = d.`memberid`
WHERE c.`is_active` = 1
AND a.memberid IS NULL
AND b.accountid IS NULL
AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= d.datecreated
ORDER BY uid
记录:
tbl_members
---------------------------
id | username | is_active |
1 | user1 | 1 |
---------------------------
table1
------------------------------
id | accountid | datecreated |
| | |
------------------------------
table2
------------------------------
id | memberid | datecreated |
| | |
------------------------------
table3
----------------------------------------
id | memberid | datecreated |
1 | 1 | 2018-06-21 00:12:51 |
----------------------------------------
当我删除此行时:
AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= d.datecreated
我得到了正确的结果。
编辑:我现在使用以下查询得到正确的结果:
SELECT b.accountid,
a.memberid,
d.memberid,
c.memberid AS uid,
d.datecreated
FROM `tbl_members` c
LEFT JOIN `tbl_bonus_direct` b
ON c.`memberid` = b.`accountid`
LEFT JOIN `tbl_wallet_cash` a
ON b.`accountid` = a.`memberid`
LEFT JOIN `tbl_members_accounts` d
ON c.`memberid` = d.`memberid`
WHERE c.`is_active` = 1
AND a.memberid IS NULL
AND b.accountid IS NULL
AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) >= date(d.datecreated)
ORDER BY uid
但是我想区分表3中的memberid
2条答案
按热度按时间anauzrmj1#
比较运算符错误。您正在使用创建过去的日期
DATE_SUB
但只能选择在该日期之后创建的记录。更改:
收件人:
将date()添加到比较中会删除您在注解中标识的问题。date_sub()的默认时间为
00:00:00
比较将考虑一天中的时间。date()删除时间,因此比较将只在date上进行。因此,您的查询变成:
ogq8wdun2#
你的第一个错误区域
在这里的table里
tbl_members
没有列名是memberidSELECT b.accountid,
a.memberid,
c.username,
d.memberid AS uid,
d.datecreated
FROM
tbl_members
cLEFT JOIN
table1
bON c.
id
= b.accountid
LEFT JOIN
table2
aON b.
accountid
= a.memberid
LEFT JOIN
table3
dON c.
id
= d.memberid
WHERE c.
is_active
= 1AND a.memberid IS NULL
AND b.accountid IS NULL
AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(d.datecreated)
ORDER BY uid
SELECT b.accountid,
a.memberid,
c.username,
d.memberid AS uid,
d.datecreated
FROM
tbl_members
cLEFT JOIN
table1
bON c.
id
= b.accountid
LEFT JOIN
table2
aON b.
accountid
= a.memberid
LEFT JOIN
(select distinct memberid, datecreated from
table3
) as dON c.
id
= d.memberid
WHERE c.
is_active
= 1AND a.memberid IS NULL
AND b.accountid IS NULL
AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(d.datecreated)
ORDER BY uid