MYSQL: Код ошибки: 1054. Неизвестный столбец в предложении where

Я пытаюсь передать столбец из внешнего запроса, как показано ниже, во внутренний запрос в предложении WHERE, и MySQL это не нравится. Я не знаю, как переписать этот запрос, чтобы он заработал.

Я получаю сообщение об ошибке Неизвестный столбец "y.DateShipped" в предложении where

Я пытаюсь присоединиться к строке во внутренней таблице с EffectiveDate, который меньше DateShipped, а также является max EffectiveDate во внутреннем соединении (может быть несколько строк для одной и той же группы с разными EffectiveDate ( s))

Я хотел бы знать, как заставить это работать или переписать его, чтобы он работал. Я использую MySQL 5.6, поэтому у меня нет доступных оконных функций, иначе я думаю, что это могло бы сработать.

select 
    x.id,
    y.id,
    y.DateShipped 
from Shipment y inner join
    (select id, SourceId, DestinationId, SourcePPFContractId, EffectiveDate 
    from Relationship where EffectiveDate <= y.DateShipped order by 
    EffectiveDate desc limit 1) x 
on x.DestinationId = y.DestinationCustomerId 
and x.SourceId = y.OriginCustomerId 
and x.SourcePPFContractId = y.OriginContractId; 
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
1 972
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

вам нужно будет указать таблицу отгрузки в подзапросе, чтобы иметь возможность вызвать ее правильно, попробуйте:

select 
    x.id,
    y.id,
    y.DateShipped 
from Shipment y inner join
    (select id, SourceId, DestinationId, SourcePPFContractId, EffectiveDate 
    from Relationship, Shipment where EffectiveDate <= Shipment.DateShipped order by 
    EffectiveDate desc limit 1) x 
on x.DestinationId = y.DestinationCustomerId 
and x.SourceId = y.OriginCustomerId 
and x.SourcePPFContractId = y.OriginContractId; 
Ответ принят как подходящий

Вы пытаетесь выполнить так называемое боковое соединение, а MySQL не поддерживает их. Поскольку вам нужен только один столбец, вы можете использовать коррелированный подзапрос:

select (select r.id 
        from Relationship r
        where r.DestinationId = s.DestinationCustomerId and
              r.SourceId = s.OriginCustomerId and
              r.SourcePPFContractId = s.OriginContractId and
              r.EffectiveDate <= s.DateShipped
        order by r.EffectiveDate desc
        limit 1
       ) as x_id,
       s.id, s.DateShipped 
from Shipment s ;

Обратите внимание, что я также изменил псевдонимы таблиц, чтобы они были сокращениями для имен таблиц, чтобы запрос было легче читать.

Сначала выполняется внутренний выбор (из отношения), а затем он объединяется с первым выбором. Вот почему это не работает. Вы должны переместить DateShipped в предложение where первого выбора:

select 
    x.id,
    y.id,
    y.DateShipped 
from Shipment y inner join
    (select id, SourceId, DestinationId, SourcePPFContractId, EffectiveDate 
    from Relationship order by 
    EffectiveDate desc limit 1) x 
on x.DestinationId = y.DestinationCustomerId 
and x.SourceId = y.OriginCustomerId 
and x.SourcePPFContractId = y.OriginContractId
and x.EffectiveDate <= y.DateShipped; 

Другие вопросы по теме