mysql连接四个表并获取1个月以上的记录

时间:2018-07-21 07:51:27

标签: mysql

我想加入四个表并获取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

2 个答案:

答案 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 

http://sqlfiddle.com/#!9/1aec8d/4