Помогите с левым объединением

Эдди

Новичок
Помогите с левым объединением

Есть три таблицы, выводящие всех туристов, сделавших заказы:

tourists - поля: tourist_id...
tourist_orders - поля: tourist_id, order_id...
orders - поля: order_id...

С объединением нет проблем

WHERE tourists.tourist_id=tourist_orders.tourist_id AND tourist_orders.order_id=orders.order_id

Проблема появляется, когда надо добавить четвертую таблицу, показывающуюу, кто из туристов получил визу.

Четвертая таблица visas - поля: tourist_id, order_id...
Если в ней нет записи, соответствующей данному туристу и данному заказу, то виза не получена. Если есть - получена.

Надо связать ОБА поля. С одним объединением LEFT JOIN я то справлюсь. А как сделать по обоим полям?
 

Gas

может по одной?
SELECT IF(v._field_ IS NULL, 0, 1) visa_exists,
...
LEFT JOIN visas AS v ON v.tourist_id=.. AND v.order_id=..

-~{}~ 11.08.10 18:43:

v._field_ - любое поле из таблицы visas
 

Эдди

Новичок
Автор оригинала: Gas
SELECT IF(v._field_ IS NULL, 0, 1) visa_exists,
...
LEFT JOIN visas AS v ON v.tourist_id=.. AND v.order_id=..

-~{}~ 11.08.10 18:43:

v._field_ - любое поле из таблицы visas
Оба.-( Не встречал такого. Пошел читать ман.

-~{}~ 11.08.10 20:30:

А как считаете, может проще при выводе каждого туриста простейшим запросом проверять, есть ли запись в таблице визы?

Да, запросов будет много, но они элементарнейшие.

Планируется вывод не более 100 туристов зараз.
Даже если всего туристов будет 10 000, все равно постранично буду выводить не более чем по 100.
 

Gas

может по одной?
я бы остановился на джойне, в крайнем случае не для "каждого туриста простейшим запросом", а для всех сразу через IN.

p.s. на "ты"
 

Эдди

Новичок
Автор оригинала: Gas
я бы остановился на джойне, в крайнем случае не для "каждого туриста простейшим запросом", а для всех сразу через IN.

p.s. на "ты"
Мне не совсем синтаксис понятен. Изучать долго буду.
К примеру, SELECT IF в первый раз вижу. Где смотреть, как делается конкретнее, если можно.
 

Эдди

Новичок
Спасибо. Посмотрел. Полезно. Но не подойдет.
Да я и сам виноват. Не до конца объяснил.

В таблице visas если нет соответствующей записи, то визы нет.
Если есть запись, то там еще будет одно поле status (ENUM), в котором инфа - в консульстве документы, получена ли виза, отказ ли.

Поэтому буду экспериментировать просто с LEFT JOIN-ами.
 

Gas

может по одной?
Поэтому буду экспериментировать просто с LEFT JOIN-ами.
в моём примере и так есть left join, IF просто для "оформления" возвращаемого значения, замени if на v.status
 

Эдди

Новичок
Автор оригинала: Gas
в моём примере и так есть left join, IF просто для "оформления" возвращаемого значения, замени if на v.status
Примерно так, хотя может где и ошибся.

SELECT
*
FROM
`orders`,
`order_tourists`,
`tourists` LEFT JOIN `visas` ON tourists.tourist_id=visas.tourist_id
WHERE
tourists.tourist_id=order_tourists.tourist_id AND
order_tourists.order_id=orders.order_id

А куда сунуть левое объединение таблицы visas с таблицей orders?
Ведь турист может в таблице встречаться много раз. А меня интересует конкретно его связь с данным заказом.
Сразу по двум столбцам объединять нельзя ведь?

Вот в чем проблема. Иначе говоря, куда деть:

`orders` LEFT JOIN `visas` ON orders.order_id=visas.order_id

В общем, нагородил я что-то.
 

Gas

может по одной?
а почему бы не убрать таблицу visas и записать данные по визам в order_tourists ?

-~{}~ 11.08.10 21:15:

попробуй заменить "LEFT JOIN `visas` ON tourists.tourist_id=visas.tourist_id"
на
LEFT JOIN `visas` ON order_tourists.tourist_id=visas.tourist_id AND order_tourists.order_id = visas.order_id
 

Эдди

Новичок
Не. Не работает.
Ладно. Спасибо. Завтра на свежие мозги буду кумекать.

Добавить столбец в таблицу туристы можно, но таблица туристы существует давно и вообще самостоятельно.
А в этом проекте просто примочка к основному проекту.

Да и противоречит это принципу БД вроде.
 

Эдди

Новичок
Автор оригинала: Gas
ух, я не говорил про таблицу туристы, говорил про order_tourists.


что значит не работает, заболела или выходной взяла?
Unknown column 'order_tourists.tourist_id' in 'on clause'

Блн. Глаза уже болят:)
Седня точно ничего не решу...
 

Gas

может по одной?
Unknown column 'order_tourists.tourist_id' in 'on clause'
так сразу бы и писал ошибку + запрос

мешать джойны запятыми и нормальный синтаксис (join) не стоит, про приоритеты операций надо помнить.
вообще-то такой запрос должен вернуть, то что нужно
Код:
SELECT
...всякие нужные поля...
FROM `tourists` 
JOIN `order_tourists` ON tourists.tourist_id=order_tourists.tourist_id
JOIN `orders` ON order_tourists.order_id=orders.order_id
LEFT JOIN `visas` ON order_tourists.tourist_id=visas.tourist_id AND order_tourists.order_id = visas.order_id
 
Сверху