【问题标题】:Error on using outer query column in subquery for date constraint在子查询中使用外部查询列进行日期约束时出错
【发布时间】:2017-01-23 17:03:38
【问题描述】:

我们有一个 Mariadb 表,其中包含 (users) 中的用户详细信息

我们有第二张表用于审核日期(reviewdates)

| 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" 

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

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

【问题讨论】:

    标签: mysql subquery mariadb


    【解决方案1】:

    我没有看到您正在过滤最外部的“reveiwdates”表,它只是用于根据内部查询显示“会议日期”, 在这种情况下,首先,没有理由在子查询中使用相同的引用。 其次,有这么多的“会议日期”,我们将哪个具体的会议日期与“updatedOn”进行比较? 您不能在不等式条件下连接两个表。 要么需要应用一个固定的审核日期过滤器,要么需要编写一个程序来循环遍历“reviewdates”表中用户的每个会议日期。

    如果您只关心该用户的最新评论,那么您可以获取并比较最新的“reviewdate”,就像您比较最新更新的时间一样,“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)
    

    【讨论】:

    • 我不认为我会过滤审查日期。我将用户链接到评论以获取每个用户的每个评论日期的列表,因为我需要在每个用户的每个评论日期之前和之后检查目标字段 (101) 中的数据,以证明我使用的代码有以前一直在工作。我现在可以展示它的工作原理,但我也被要求检查每个现有条目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 2021-12-30
    • 1970-01-01
    • 2012-11-09
    • 2018-06-21
    • 1970-01-01
    相关资源
    最近更新 更多