Ошибка в синтаксисе запроса

Sky_Flex

Новичок
Ошибка в синтаксисе запроса

на локальном хосте с БД 4.1.8 запрос работает на ура, а вот на хостинге с БД 5.хх.хх
пишет ошибку "Unknown column 'c.id' in 'on clause'"

помогите понять что не так в синтаксисе?

PHP:
SELECT 
	c.id,
	c.sname,
	COALESCE(up.id_site, 0) AS post 
FROM 
	catalog AS c, 
	user_sites AS us 
	LEFT JOIN cat_tarif AS ct ON ct.pid = c.id 
	LEFT JOIN cat_catalog AS cc ON cc.pid = c.id 
	LEFT JOIN user_post AS up ON up.id_catalog = c.id 
WHERE 
	us.id = '4' 
	AND ct.tarif = us.tarif 
	AND cc.cat_site = us.p_cat_site 
GROUP BY c.id
ORDER BY c.yc DESC
вроде на таблицу catalog алиас поставил - и потом только уже использую c.id, а в ошибке нет в листе...
 

Sky_Flex

Новичок
почитал...

Example:
CREATE TABLE t1 (i1 INT);
CREATE TABLE t2 (i2 INT);
CREATE TABLE t3 (i3 INT);
SELECT * FROM t1 JOIN t2 ON (i1 = i3) JOIN t3;

Previously, the SELECT statement was legal. Now the statement fails with an Unknown column 'i3' in 'on clause' error because i3 is a column in t3, which is not an operand of the ON clause. The statement should be rewritten as follows:
SELECT * FROM t1 JOIN t2 JOIN t3 ON (i1 = i3);
и тем не менее не смог разобраться со своим запросом... пробовал его переписать - в итоге выводит не те значения что первоначальный запрос...
 

Sky_Flex

Новичок
сакральный смысл объединения 2х таблиц
дело в том что таблицы "catalog" и "user_sites" друг с другом никакне связаны.
Но каждая из них по отдельности связанна с таблицами "cat_tarif", "cat_catalog" and "user_post". И для выборки данных именно для пользовательского сайта с АйДи "4" добавляю в условие необходимые данные:
PHP:
us.id = '4'  
AND ct.tarif = us.tarif  
AND cc.cat_site = us.p_cat_site
т.е. чтобы вытаскивая ВСЕ данные одним запросом... можно конечно вытащить сначала "us.tarif " и "us.p_cat_site" отдельным запросом, и позже просто выставить условие
PHP:
ct.tarif = 4
AND cc.cat_site = 9
т.е. тянуть все одним запросом никак?
ну впринципе можно и двумя тянуть...
 

alpine

Новичок
Sky_Flex
В кратце: в 5ке изменился приоритет операторов. Теперь запятая имеет меньший приоритет чем JOIN, тоесть сначала выполняется JOIN таблиц в которых ты ссылаешься на колонку таблицы которая еще не учавствовала в объединении и выводится ошибка что такой колонки нет. Для решения этой проблемы нужно запятую заменить на ее еквивалент(в данном примере) CROSS JOIN.
Подробно все написано в документации в разделе:
Join Processing Changes in MySQL 5.0.12
 

Sky_Flex

Новичок
Спасибо! все ок!

-~{}~ 24.11.06 12:08:

с тем запросом разобрался - про запятые и КРОСС Джойн понял. заставил запрос работать на 5ке.

но, хм... появился еще вопрос...

PHP:
SELECT 
	us.id,
	us.url,
	COALESCE(t.name, '-') AS tarif,
	(   SELECT 
			COUNT(DISTINCT up.id_catalog) 
		FROM 
			cat_catalog AS cc 
			CROSS JOIN catalog AS c 
			LEFT JOIN cat_tarif AS ct ON ct.pid = c.id 
			LEFT JOIN user_post AS up ON (up.id_catalog = c.id AND up.id_site = us.id) 
		WHERE 
			c.id = cc.pid 
			AND ct.tarif = us.tarif 
			AND cc.cat_site = us.p_cat_site   )  AS post_cat 
FROM 
	user_sites AS us 
	LEFT JOIN tarif AS t ON t.id = us.tarif 
WHERE 
	us.pid = 5
ругается так же...:
Unknown column 'us.id' in 'on clause'

но тут уже на строку:
PHP:
LEFT JOIN user_post AS up ON (up.id_catalog = c.id AND up.id_site = us.id)
как видно кроме приоритетов запятых и джойнов еще что то есть... через ман пытался делать (немного перестраивать синтаксис этой строки) - выдает не верный результат (всмысле не тот что мне нужен)

помогите - как поправить по 5ку запрос?!?
 
Сверху