MySQL LEFT JOIN после изменений 5.0.12 - Как переписать запрос - PullRequest
0 голосов
/ 31 марта 2009

После 5.0.12 MySQL изменил синтаксис для левых соединений, чтобы соответствовать стандарту SQL2003. Так

... FROM t1 , t2 LEFT JOIN t3 ON (expr)

необходимо переписать как

... FROM (t1 , t2) LEFT JOIN t3 ON (expr

или он будет проанализирован как ... FROM t1 , (t2 LEFT JOIN t3 ON (expr))

Теперь у меня есть старое приложение, которое я портирую с MySQL 3.23 (eek!) На 5.1, и старый код имеет такой запрос:

select b.*, c.*, g.*, p.perfname, p.persname 
from bookings b, customer c 
left join grade g on b.chrggrade=g.grcode 
left join person p on b.person=p.percode 
where complete='Y' and invoiced='N' 
and datemade between '2009-03-25' and '2009-03-31' 
and c.custcode=b.cust 
order by cust, person, tsref, stdt 

Сбой при ошибке SQL 1054, неизвестный столбец в b.chrggrade. Это потому что он разбирается как

выберите b. , c. , g. *, P.perfname, p.persname из бронирования б, (клиент с левый класс g на b.chrggrade = g.grcode) оставленный присоединяющийся человек p на b.person = p.percode где завершено = 'Y' и выставлено счет-фактура = 'N' и дата сделана между '2009-03-25' и '2009-03-31' и c.custcode = b.cust заказ по заказу, человек, црэф, stdt

Я думаю.

Я уверен, что правильно расположенные скобки могут это исправить, но я в тупике. Я нашел ссылку на это изменение в http://bugs.mysql.com/bug.php?id=13551,, которая показывает, как исправить простое левое соединение, но я все еще не могу решить его для этого запроса. David

1 Ответ

4 голосов
/ 31 марта 2009

Прекратите использовать синтаксис запятой вообще и будьте явными в ваших операторах JOIN. Синтаксис запятой заставляет вас помещать условие JOIN в предложение WHERE, которое может выполняться только после соединения LEFT / RIGHT, в зависимости от того, как оно анализируется. Использование явного JOINS в любом случае делает запрос более читабельным.

... ОТ t1, t2 СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ t3 ВКЛ (expr) становится ... ОТ ВНУТРЕННЕГО СОЕДИНЕНИЯ t1 ВКЛ t2 (expr) СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ t3 ВКЛ (expr)

Это также исправит ошибку, которую вы видите. Если в таблице бронирований нет chrggrade, то ничего не исправит ошибку.

...