2014-08-13 4 views
0

Предположим, у меня есть две таблицы:RIGHT OUTER JOIN не работает с ИНЕКЕ

 CREATE TABLE `test_a` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(20) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

И

CREATE TABLE `test_b` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `A_id` int(11) NOT NULL, 
    `Amount` float NOT NULL, 
    `cat` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `test_b_ibfk_1` (`A_id`), 
    CONSTRAINT `test_b_ibfk_1` FOREIGN KEY (`A_id`) REFERENCES `test_a` (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; 

В test_a я введенные данные

1, A
2, B
3, C

Во второй таблице я вошел следующие данные: 1, 1, 4,78, 1
2, 2, 77, 1
3, 1, 0,22, 1
4, 2, 13, 1

Задача: выбрать сумму всех сумм, сгруппированных по a_id, все данные из test_a должны появиться. Таким образом, я использую правое внешнее соединение. Когда я побежал следующий запрос:

SELECT a.name, sum(b.amount) 
    FROM test_b AS b RIGHT OUTER JOIN test_a AS a ON b.A_id = a.id 
GROUP BY b.A_id; 

Это дает результирующий набор по желанию. Как это: C - нуль
A - 5
B - 90

Но когда я ИНЕКЕ:

  SELECT a.name, sum(b.amount) 
      FROM test_b AS b RIGHT OUTER JOIN test_a AS a ON b.A_id = a.id 
      **where b.cat =1** 
      GROUP BY b.A_id; 

Я получаю результат: А - 5
B - 90

Мой вопрос: Как достичь такого же результата с предложением WHERE. (Я хочу «C - null», появится)

Благодарим заранее!

ответ

1

Вы должны включить ваше состояние присоединяемой таблицы Ь в состоянии ON:

SELECT a.name, sum(b.amount) 
FROM 
    test_b AS b 
RIGHT OUTER JOIN 
    test_a AS a 
ON 
    b.A_id = a.id AND b.cat =1 
GROUP BY b.A_id; 

Потому что, если используется в ИНЕКЕ он изменяет OUTER JOIN неявно к INNER JOIN.

+0

Спасибо, я попробую сейчас – GGSoft

+0

Спасибо большое, VMai Было полезно, я буду отмечать его, но не могу голосовать из-за моей небольшой репутации, извините. – GGSoft

+0

Было так просто !!! Еще раз спасибо!!!! – GGSoft

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