2015-09-17 2 views
3

У меня есть таблицы: mainTable, A, B и C. Таблица C - таблица отношений между A и B (n: n) - C = (A_ID, B_ID). Я попробовал следующий запрос:Строгие левые соединения от n: n стол

select * from mainTable 
left join A on (mainTable.id=A.mainTableId) 
left join C on (C.A_id = A.id) 
left join B on (C.B_id = B.id) 
where B.type=1; 

Проблема здесь в том, если я хочу, чтобы получить только те строки из mainTable, где ВСЕ В продукты типа 1. Теперь я получаю все строки из mainTable где, по меньшей мере, один B продукт существует с тип 1.

ответ

1

Move, что WHERE условие JOIN ON условие, чтобы получить надлежащее внешнее соединение эффект как

select mt.* from mainTable mt 
left join A on (mt.id=A.mainTableId) 
left join C on (C.A_id = A.id) 
left join B on (C.B_id = B.id) AND B.type=1; 
1

меня вставить один левый присоединиться к более. Это подсчитывает все продукты этого раздела, а также все продукты от типа = 1. Таким образом, можно сказать, в том, где cnt.count = cnt.anz_type1, чтобы получить все продукты, если есть от 1-го типа

select * from mainTable 
left join A on (mainTable.id=A.mainTableId) 
left join C on (C.A_id = A.id) 
left join B on (C.B_id = B.id) 
LEFT JOIN (
    SELECT B.id , 
    sum(IF(B.type=1,1,0)) anz_type1 , 
    sum(1) total 
    FROM B GROUP BY id 
    ) cnt ON C.B_id = cnt.id 
where cnt.total = cnt.anz_type1; 
0

Попробуйте это ... .

select * from mainTable 
inner join A on (mainTable.id=A.mainTableId) 
inner join C on (C.A_id = A.id) 
inner join B on (C.B_id = B.id AND B.type=1); 

Это даст вам все строки из maintable, где вСЕ B продукты имеют тип 1.

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