2017-01-23 67 views
0

我們有一個MariaDB的表中(用戶)錯誤的子查詢使用外部查詢欄的日期約束

用戶的詳細信息我們有一個評審日期的第2個表(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)。

任何一個字段都可以隨時更新。

每個用戶有很多評論日期。我需要將檢查完成後舊字段的第一個值與檢查日期前的最後一個值進行比較,以確保它們已正確複製。由於用戶可以更改任何字段,因此必須在完成過程之前和之後立即進行比較。

,所以我加入的用戶和reviewdates

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" 

錯誤。我發現大量的陳述說我不能在子查詢中引用外連接,但沒有提供適用於這些日期約束的可能答案。

任何幫助或指針,將不勝感激。

回答

0

我沒有看到你正在用任何特定的東西過濾最外層的'reveiwdates'表,它只是用來顯示基於內部查詢的'meetingdate',在這種情況下,首先,沒有理由在子查詢中使用相同的引用。其次,有很多'會議',具體的會議日期是我們比較'updatedOn'? 您不能在不平等條件下連接兩個表。 需要應用常數審閱日期過濾器,或者需要編寫過程來循環「審閱日期」表中用戶的每個會議日期。

如果你只是關心該用戶的最新評論,那麼你可以獲取並比較最新的「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) 
+0

我不認爲我會過濾審查日期。我將用戶鏈接到評論以獲取每個用戶的每個評論日期的列表,因爲我需要在每個評論日期之前和之後檢查每個用戶的目標字段(101)中的數據,以證明我使用的代碼具有以前一直在工作。我現在可以顯示其工作,但我也被要求檢查每個現有的條目。 – user3797323