我想加入四个表并获取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中的成员ID
答案 0 :(得分:1)
比较运算符是错误的。您正在使用DATE_SUB
创建一个过去的日期,但是仅选择在该日期之后创建的记录。
更改:
AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= d.datecreated
收件人:
AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) >= DATE(d.datecreated)
将DATE()添加到比较中应删除您在注释中标识的问题。 DATE_SUB()的默认时间为00:00:00
,并且比较将考虑一天中的时间。 DATE()删除了时间,因此比较将仅在日期上进行。
因此,您的查询变为:
SELECT b.accountid,
a.memberid,
c.memberid,
d.memberid AS uid,
d.datecreated
FROM `tbl_members` c
LEFT JOIN `table1` b
ON c.`memberid` = b.`accountid`
LEFT JOIN `table2` a
ON b.`accountid` = a.`memberid`
LEFT JOIN `table3` d
ON a.`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
答案 1 :(得分:1)
您的第一个错误区域
`tbl_members` c
LEFT JOIN `table1` b
ON c.`memberid` = b.`accountid`
此处tbl_members
中的表中没有列名是memberid
第二个错误
LEFT JOIN `table3` d
ON a.`memberid` = d.`memberid`
table3
连接将在表tbl_members
中发生
现在我要更正您的查询,下面是
SELECT b.accountid,
a.memberid,
c.username,
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 c.`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) <= date(d.datecreated)
ORDER BY uid
我认为您想要这样的东西,因为您说您需要不同的会员ID
SELECT b.accountid,
a.memberid,
c.username,
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
(select distinct memberid, datecreated from `table3` ) as d
ON c.`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) <= date(d.datecreated)
ORDER BY uid