2013-04-05 1 views
1

В MySQL я хочу SELECT A.* FROM A где внутреннее соединение условие выполняется ли непосредственно (присоединение таблицы B) или через другую таблицу соединения (C), WHERE B.field = myvalue. Может ли кто-нибудь указать правильный способ получить результаты?Mysql внутреннее соединение дважды и использовать WHERE на обоих присоединяется

У меня есть следующие таблицы: A, B, C, которые связаны следующим образом (A присоединяется к B, B присоединяется C, A присоединяется C):

 B 
    / \ 
    A --- C 

Это выглядит довольно просто, но я получаю пустое множество, когда я запускаю следующий код, даже если я получаю результаты, когда я ограничить поиск только присоединение B через C:

SELECT A.* FROM A 
INNER JOIN C ON C.id = A.c_id 
INNER JOIN B AS B_thru_C ON B_thru_C.id = C.b_id 
INNER JOIN B AS B_from_A ON B_from_A.id = A.b_id 
WHERE B_thru_C.field = 'myvalue' OR B_from_A.field = 'myvalue'; 
# yields an empty set 

SELECT A.* FROM A 
INNER JOIN C ON C.id = A.c_id 
INNER JOIN B AS B_thru_C ON B_thru_C.id = C.b_id 
WHERE B_thru_C.field = 'myvalue'; 
# yields results 
+0

Должен ли запрос возвращать записи из набора A, даже если нет успешного соединения с B или C? Или он должен также устранить их в этом сценарии? –

ответ

0

Как об этом?

SELECT A.* FROM A 
LEFT OUTER JOIN C ON C.id = A.c_id 
INNER JOIN B ON B.id = A.b_id OR B.id = C.b_id 
WHERE B.field = 'myvalue'; 
+0

Это исключает все записи из набора результатов, если предикат объединения не выполняется для B. Это неясно, если это имеет значение для OP или нет. –

+0

Это хорошо. Мне нужны только записи, в которых выполняется условие соединения. – JellicleCat

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