在子查询中使用外部查询列进行日期约束时出错

时间:2017-01-23 17:03:39

标签: mysql subquery mariadb

我们在(用户)

中有一个Mariadb表,其中包含用户详细信息

我们有第二个审核日期表(审核日期)

| reviewID |USERID |A review date       |
| 001      | 123   |2017-01-08 09:02:10 |
etc...

记录针对每个用户的审核会议日期。

我们有一个第三个表(userdata),其中包含多种类型的用户数据。字段ID 101是审核的新目标。字段ID 98是来自先前评论的旧目标。

|dataID|Userid |Field ID |FieldValue   |UpdatedOn |UpdatedBy|
-------------------------------------------------------------
|0001  |123    | 101     |my new target|2017-01-10|145      |
|0002  |123    | 98      |my old target|2017-01-10|0        |

审核完成后,新目标(字段ID 101)将被复制到旧目标(字段ID 98)。

任何一个字段都可以随时更新。

每个用户都有很多评论日期。我需要将审核完成后旧字段的第一个值与审核日期之前的最后一个值进行比较,以确保它们已正确复制。由于用户可以更改任一字段,因此必须在完成过程之前和之后进行比较。

所以我加入了用户并审核了

select  users.userid,users.username,reviewdates.meetingdate
from companyusers users
join reviewdates on reviewdates.userid = users.userid

这给了我所有用户的所有评论日期

然后我试图找到101字段的最新条目:

select  users.userid,users.username, reviewdates.meetingdate, latest101.fielddetails,latest101.updatedon
from users
join reviewdates on reviewdates.userid = users.userid
left join (select userdata.* from userdata u1 
        where u1.fieldid = 101 
        and u1.updatedOn = (select max(u2.updatedon) 
                from userdata u2 
                where u1.userid = u2.userid 
                and u2.fieldid = 101)
                ) as latest101 on (latest101.userid = users.userid)

这也可以,但是当我尝试在 每个审核日期之前找到最新的 条目时:

select  users.userid,users.username,reviewdates.meetingdate,latest101.fielddetails,latest101.updatedon
from users
join reviewdates on reviewdates.userid = users.userid
left join (select userdata.* from userdata u1 
        where u1.fieldid = 101 
        and u1.updatedOn = (select max(u2.updatedon) 
            from userdata u2 
            where u1.userid = u2.userid 
            and u2.fieldid = 101
#date limit
            and u2.updatedOn < reviewdates.meetingdate)

            ) as latest101 on (latest101.userid = users.userid)

我得到了

"unknown column reviewdates.meetingdate in where clause" 

错误。我发现很多语句说我不能引用子查询中的外连接,但没有提供适用于这些日期约束的可能答案。

任何帮助或指示都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我没有看到你用特定的东西过滤最外层的'reveiwdates'表,它只是用于根据内部查询显示'meetingdate', 在这种情况下,首先,没有理由在子查询中使用相同的引用。 其次,有很多'会议日',具体会议日期是我们与'updatedOn'进行比较? 您不能在不相等的条件下连接两个表。 需要应用常量审核日期过滤器,或者需要编写过程以在“reviewdates”表中循环查看用户的每个会议日期。

如果您只是关心该用户的最新评论,那么您可以获取并比较最新的“评论日期”,就像您比较最新更新时一样,'updatedOn'似乎没有时间组件,并避免其他问题在比较时使用date()或等价物。

select  users.userid,users.username,reviewdates.meetingdate,latest101.fielddetails,latest101.updatedon
from users
join reviewdates on reviewdates.userid = users.userid
left join (select userdata.* from userdata u1 
    where u1.fieldid = 101 
    and u1.updatedOn = (select max(u2.updatedon) 
        from userdata u2 
        where u1.userid = u2.userid 
        and u2.fieldid = 101
        #date limit
        and u2.updatedOn < (select date(max(reviewdates.meetingdate)) from reviewdates where u2.userid = reviewdates.userid))

        ) as latest101 on (latest101.userid = users.userid)