2015-03-06 3 views
0

Давайте предположим, что у меня есть:MySQL с условием ON из другой таблицы

SELECT * FROM a 
LEFT OUTER JOIN b ON b.a_id = a.id 
LEFT OUTER JOIN c ON b.c_id = c.id 

Теперь то, что я хочу сделать, это выбрать Б, присвоенные с, не е. г. active (c.active = 1). Как я могу это сделать с помощью ON?

Обратите внимание, что я не могу использовать WHERE после всего запроса выше, потому что я хочу, чтобы его возвращали, даже если найдены 0 b.

+0

'LEFT OUTER JOIN C ON b.c_id = c.id и c.active = 1' –

+0

Это неверно и вернет b с пустыми c, и я не хочу, чтобы b был возвращен, если c пуст – user294034

+1

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

ответ

0

Вы попробовали что-то вроде этого?

SELECT * FROM в левое внешнее соединение B ON b.a_id = a.id И c.active = "1" LEFT OUTER JOIN с ПО b.c_id = c.id И c.active = "1"

+0

Дает ошибку, потому что пытается сделать условие для таблицы, которая еще не присоединена – user294034

+0

Возможно, вам нужно использовать внутреннее соединение. SELECT * FROM b INNER JOIN c ON b.is = c.is; –

+0

С внутренним соединением возвращается 0 a, если 0 c's найдено – user294034

0

Просто, чтобы убедиться, я понял вопрос: вам нужны все строки, где либо c.active равно 1, либо где нет записи в b или c, правильно?

Это немного длинный, но это похоже на работу:

SELECT * FROM a 
LEFT OUTER JOIN b ON a.aid = b.aid 
LEFT OUTER JOIN c ON b.bid = c.bid 
WHERE a.aid NOT IN (
    SELECT a.aid FROM a 
    INNER JOIN b ON a.aid = b.aid 
    INNER JOIN c ON b.bid = c.bid 
    WHERE NOT c.active 
); 

Я мог бы также представить себе решение, используя UNION

+0

Да, что-то вроде этого, но в этом случае использование подзапроса равно просто сделать второй, более простой запрос. Мне просто интересно, возможно ли это сделать в одном запросе – user294034

0

Какие строки будут возвращены в каждом конкретном случае ... Обратите внимание, что один случай индивидуален:
FROM b JOIN c ON ... AND c.active=1 - строки в обеих таблицах существуют и активные
FROM b JOIN c ON ... WHERE c.active=1 - Ditto
FROM b LEFT JOIN c ON ... WHERE c.active=1 - Ditto
FROM b LEFT JOIN c ON ... AND c.active=1 - все буквы b, но NULL для неактивных/отсутствующих c's
(Предостережение: я не уверен, что получил правильные случаи; . Просто имейте в виду, что и где находятся не всегда взаимозаменяемы)

При смешивании JOIN и LEFT JOIN, вы может нужно добавить скобки:
FROM a JOIN (b LEFT JOIN c ON...) ON ... WHERE ...
FROM (a JOIN b ON ...) LEFT JOIN c ON... WHERE ...

Смежные вопросы