2017-01-23 12 views
0

У нас есть таблица MariaDB с подробной информацией пользователей в (пользователях)Ошибки при использовании внешнего столбца запроса в подзапросе для даты ограничения

У нас есть 2-ая таблица дата пересмотра (reviewdates)

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

, что записи просматривать даты встреч с каждым пользователем.

У нас есть 3-я таблица (пользовательские данные) с несколькими типами пользовательских данных. Поле 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

Я не вижу, что вы отфильтровываете самую внешнюю таблицу «раскрывающихся» с чем-то конкретным, она просто используется для отображения «встречи» на основе внутренних запросов, в этом случае, во-первых, нет причин для используйте ту же ссылку внутри подзапроса. Во-вторых, существует так много «встреч», какая конкретная дата встречи мы сравниваем с «updatedOn»? Вы не можете присоединиться к двум таблицам в условии равенства. Должен быть применен либо фильтр постоянной даты обзора, либо процедура должна быть записана в цикле каждой даты собрания для пользователя в таблице «reviewdates».

Если вам просто нужен последний отзыв для этого пользователя, вы можете получить и сравнить последнюю версию «reviewdate» так же, как, как вы сравниваете последнее обновление, «updatedOn», похоже, не имеет временного компонента и избегать другие вопросы используют дату() или эквивалент при сравнении.

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