it-swarm.com.ru

MySQL неизвестный столбец в предложении ON

У меня есть следующий запрос MySQL:

SELECT p.*,
    IF(COUNT(ms.PropertyID) > 0,1,0) AS Contacted,
    pm.MediaID,
    date_format(p.AvailableFrom, '%d %b %Y') AS 'AvailableFrom',
    astext(pg.Geometry) AS Geometry
FROM property p, propertygeometry pg
    JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216
    LEFT JOIN message ms ON ms.PropertyID = p.id AND ms.SenderID = 384216
    LEFT JOIN property_media pm ON pm.PropertyID = p.id AND pm.IsPrimary = 1
WHERE p.paused = 0
    AND p.PropertyGeometryID = pg.id
GROUP BY p.id

И я получаю эту ошибку:

# 1054 - Неизвестный столбец 'p.id' в 'предложении'

Насколько я вижу, запрос выглядит правильно, есть идеи, что может быть не так?

54
Matthew James Taylor

Не смешивайте соединения в стиле ANSI-89 и ANSI-92. Они имеют различный приоритет, который может привести к ошибкам, и вот что здесь произошло. Ваш запрос интерпретируется следующим образом:

FROM property p, (
    propertygeometry pg
    JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216
    ...
)

В приведенном выше примере объединения, использующие ключевое слово JOIN, оцениваются в первую очередь до того, как даже рассматривается соединение в стиле запятой. На данный момент таблица p еще не объявлена.

Из руководство по MySQL :

Однако приоритет оператора запятой меньше, чем INNER JOIN, CROSS JOIN, LEFT JOIN и т.д. Если вы смешиваете запятые объединения с другими типами соединений при наличии условия соединения, возникает ошибка в форме Неизвестный столбец "col_name" в "предложении" может возникнуть. Информация о решении этой проблемы приведена ниже в этом разделе.

Я бы порекомендовал всегда использовать соединения в стиле ANSI-92, то есть использовать ключевое слово JOIN:

SELECT p.*,
    IF(COUNT(ms.PropertyID) > 0,1,0) AS Contacted,
    pm.MediaID,
    date_format(p.AvailableFrom, '%d %b %Y') AS 'AvailableFrom',
    astext(pg.Geometry) AS Geometry
FROM property p
    JOIN propertygeometry pg ON p.PropertyGeometryID = pg.id
    JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216
    LEFT JOIN message ms ON ms.PropertyID = p.id AND ms.SenderID = 384216
    LEFT JOIN property_media pm ON pm.PropertyID = p.id AND pm.IsPrimary = 1
WHERE p.paused = 0
GROUP BY p.id

Связанные с:

95
Mark Byers

Как указывалось ранее, существует проблема с приоритетом при использовании объединений через оператор запятой, при котором будет выполняться LEFT JOIN, и поэтому ссылки на псевдонимы таблиц не будут существовать в это время. Хотя вы можете неявно указать MySQL использовать JOIN через этот оператор, вы также можете указать MySQL сначала выполнить оценку таблиц, объединенных запятыми, а затем выполнить левое соединение следующим образом:

SELECT p.*,
IF(COUNT(ms.PropertyID) > 0,1,0) AS Contacted,
pm.MediaID,
date_format(p.AvailableFrom, '%d %b %Y') AS 'AvailableFrom',
astext(pg.Geometry) AS Geometry
FROM (property p, propertygeometry pg)
JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216
LEFT JOIN message ms ON ms.PropertyID = p.id AND ms.SenderID = 384216
LEFT JOIN property_media pm ON pm.PropertyID = p.id AND pm.IsPrimary = 1
WHERE p.paused = 0
AND p.PropertyGeometryID = pg.id
GROUP BY p.id

Обратите внимание, что разделенные запятыми таблицы содержатся в скобках (). Псевдонимы и столбцы таблицы теперь будут доступны для других ваших JOIN.

10
Tom Mulkins

Я наткнулся на этот столбец с неизвестной ошибкой. Разница заключается в том, что запрос создается через HQL внутри session.executeQuery ("выберите идентификатор, имя, сумму (оплачено), custType из группы клиентов по бренду"), поэтому приходится вручную вводить внутреннее объединение или Ключевое слово join не является опцией, поскольку hql является тем, кто его генерирует. он производит запрос примерно так:

select cust_id, name, sum(paid), c.custTypeId
from customer c, custType ct
on c.custTypeId  = ct.custTypeId 

он говорит "неизвестный столбец c.custTypeId", когда я уверен на 101%, что он несет этот столбец.

Мои занятия/отношения:

Customer {
Integer custId
CustomerType custType
}

CustomerType{
 Integer custTypeId
string code
}

проблема заключается в запятой в строке "from customer, custType". это должно быть со словом JOIN, как ответ, изложенный выше. но так как это HQL и генерируется, я не могу этого сделать. То, что я сделал, было изменено запросом, и вместо ввода select custType я набрал select custType.id, custType.code

Я знаю, что это просто, но для таких новичков, как я, это была борьба.

1
user742102