MySQL неизвестный столбец в предложении ON - PullRequest
54 голосов
/ 01 ноября 2010

У меня следующий запрос 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» в «предложении»

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

Ответы [ 3 ]

95 голосов
/ 01 ноября 2010

Не смешивайте соединения в стиле 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

Связанный:

10 голосов
/ 06 ноября 2014

Как указывалось ранее, существует проблема с приоритетом при использовании объединений через оператор запятой, при котором будет выполняться 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.

1 голос
/ 11 сентября 2013

Я наткнулся на этот неизвестный столбец с ошибкой, разница в том, что запрос строится через HQL внутри session.executeQuery («выберите идентификатор, имя, сумму (оплачено), custType из группы cust по бренду»), поэтому приходится вводить вручную Внутреннее соединение или ключевое слово соединения не является опцией, поскольку 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

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

...