Подтвердить что ты не робот

Неизвестный столбец 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" в разделе "on"

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

4b9b3361

Ответ 1

Не смешивайте стили стиля 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" в разделе "on" . Информация о решении этой проблемы приводится ниже в этом разделе.

Я бы рекомендовал всегда использовать объединения типа 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

по теме:

Ответ 2

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

Ответ 3

Я столкнулся с этой неизвестной ошибкой столбец, diff - это запрос, построенный через HQL внутри session.executeQuery( "выберите id, name, sum (paid), custType из группы cust по бренду" ), поэтому для того, чтобы вручную вводить ключевое слово inner join или 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
}

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

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