MySQL 5.0.18 - проблема с join

confguru

ExAdmin
Команда форума
MySQL 5.0.18 - проблема с join

[sql]
SELECT shows.show_id, shows.name, images_shows.image_url, reviews.short_text, reviews.review_small
FROM shows, reviews
INNER JOIN images_shows ON (images_shows.show_id = shows.show_id AND images_shows.class = 1)
[/sql]

Ругается на #1054 - Unknown column 'shows.show_id' in 'on clause'

На 4-ке это работает
 

.des.

Поставил пиво кому надо ;-)
Странный запрос. Какая связь между таблицами shows и reviews?
Добавление условий (только не в where) для связи этих таблиц должно решить проблему.
 

confguru

ExAdmin
Команда форума
Она есть, просто сократил.
Я так понимаю надо писать что-то типа
INNER JOIN (images_shows, shows) ON ( images_shows.show_id = shows.show_id AND images_shows.class = 1 )
 

.des.

Поставил пиво кому надо ;-)
Я имел ввиду что-то вроде такого
PHP:
SELECT shows.show_id, shows.name, images_shows.image_url, reviews.short_text, reviews.review_small
FROM shows 
    КАКОЙ-ТО JOIN reviews ON shows.show_id = reviews.show_id
   INNER JOIN images_shows ON ( images_shows.show_id = shows.show_id AND images_shows.class = 1 )
 

alpine

Новичок
admin
Я так понимаю что вот эта запись
shows, reviews
означает
shows INNER JOIN reviews
и если условие ON отсутствует то она отработает как
shows CROSS JOIN reviews.

Из мана для MySQL 5.0.x: JOIN Syntax
In MySQL, CROSS JOIN is a syntactic equivalent to INNER JOIN (they can replace each other. In standard SQL, they are not equivalent. INNER JOIN is used with an ON clause, CROSS JOIN is used otherwise.
 

.des.

Поставил пиво кому надо ;-)
Но в любом случае, я бы рекомендовал запостить это как баг репорт.
Потому что если это не баг, то по крайней мере documentation problem.
PHP:
CREATE TABLE `t1` (`id` int(11) NOT NULL PRIMARY KEY);
CREATE TABLE `t2` (`id` int(11) NOT NULL PRIMARY KEY);
CREATE TABLE `t3` (`id` int(11) NOT NULL PRIMARY KEY);
SELECT * FROM t1,t2 INNER JOIN t3 ON (t1.id=t3.id);

Actual result:
ERROR 1054 (42S22): Unknown column 't1.id' in 'on clause'
-~{}~ 13.01.06 14:21:

INNER JOIN and , (comma) are semantically equivalent in the absence of a join condition: both produce a Cartesian product between the specified tables (that is, each and every row in the first table is joined to each and every row in the second table).
-~{}~ 13.01.06 14:24:

то есть если верить ману должен работать следующий запрос
PHP:
SELECT * FROM t1,t2 INNER JOIN t3 ON (t1.id=t3.id) WHERE t1.id=t2.id;
но такой запрос также выдает:
PHP:
ERROR 1054 (42S22): Unknown column 't1.id' in 'on clause'
Но если запятую заменить на любой из JOIN , то ошибка не проявляется.
 

alpine

Новичок
.des.
А так
[sql]
SELECT * FROM t1 INNER JOIN t2 INNER JOIN t3 ON (t1.id=t3.id);
SELECT * FROM t1 CROSS JOIN t2 CROSS JOIN t3 ON (t1.id=t3.id);
[/sql]
отрабатывает нормально.

-~{}~ 13.01.06 14:26:

[sql]
SELECT VERSION();
[/sql]
5.0.16-standard-log

-~{}~ 13.01.06 14:36:

MySQL Bugs: #15823: Fake "Unknown column" error with some JOIN syntaxes

-~{}~ 13.01.06 14:48:

В доку этот нюанс записали:
Before MySQL 5.0.12, the comma operator (,) and JOIN both had the same precedence, so the join expression t1, t2 JOIN t3 was interpreted as ((t1, t2) JOIN t3). Now JOIN has higher precedence, so the expression is interpreted as (t1, (t2 JOIN t3)). This change affects statements that use an ON clause, because that clause can refer only to columns in the operands of the join, and the change in precedence changes interpretation of what those operands are.
-~{}~ 13.01.06 14:53:

Prior to 5.0.12, the SELECT is legal due to the implicit grouping of t1,t2 as (t1,t2). From 5.0.12 on, the JOIN takes precedence, so the operands for the ON clause are t2 and t3. Because t1.i1 is not a column in either of the operands, the result is an Unknown column 't1.i1' in 'on clause' error. To allow the join to be processed, group the first two tables explicitly with parentheses so that the operands for the ON clause are (t1,t2) and t3:
SELECT * FROM (t1, t2) JOIN t3 ON (t1.i1 = t3.i3);
 

.des.

Поставил пиво кому надо ;-)
на мой взгляд это баг, который не захотели править, но это даже к лучшему :) условие объединения таблиц гораздо удобнее читать в ON условие, чем в WHERE...
 

confguru

ExAdmin
Команда форума
Ну короче надо ставить 5-ку отдельно протестировать сайт,
а только потом переезжать :)
 
Сверху