2010-03-24 2 views
1

У меня есть таблица:MySQL - соединение трех таблиц с HAVING

id name type 

где "тип" является 1 или 2

мне нужно присоединиться к этой таблице с двумя другими. Строки с «type = 1» должны быть соединены с первой таблицей, а = 2 со второй.

Например, основная таблица содержит некоторые события, которые люди сделали. Кулак-стол для соединения - это информация о мужчинах, а во-вторых, о женщинах. Тип - секс.
Мне нужно принять последние 10 событий со всей информацией об этих народах.

Что-то вроде

SELECT * 
FROM tbl 
INNER JOIN tbl_1 ON tbl.name = tbl_1.name HAVING tbl.type = 1 
INNER JOIN tbl_2 ON tbl.name = tbl_2.name HAVING tbl.type = 2 

Но это не работает.
Как это можно реализовать?

ответ

2

Во-первых, статья HAVING предназначена для группировки, а не объединения. Просто включите условие в предложении ON

ON tbl.name = tbl_1.name AND tbl.type = 1 

Во-вторых, если условие невыполненным, строка не будет появляться в результате внутреннего соединения. Поскольку поле (tbl.type) не может иметь двух разных значений, никаких строк не будет. Вместо этого попробуйте использовать левое внешнее соединение.

SELECT * 
    FROM tbl 
    LEFT JOIN tbl_1 ON tbl.name = tbl_1.name AND tbl.type = 1 
    LEFT JOIN tbl_2 ON tbl.name = tbl_2.name AND tbl.type = 2 

Однако это вызывает вопрос: почему не могу вам разрешить все поля в результате, и игнорировать те, что вы не заботитесь о?

+0

Следует указать разницу между ВЛЕВОЙ (ВНЕШНИЙ) ВХОДОМ и ВНУТРЕННИМ СОЕДИНЕНИЕМ. INNER JOIN не даст вам никакого результата. – erikkallen

1

Похоже, вы пытаетесь связать два отдельных набора данных вместе - считаете ли вы, что используете Union All в двух запросах? Что-то вроде:


select * from tbl inner join tbl_1 on tbl.name = tbl1.name where tbl.type = 1 
union all 
select * from tbl inner join tbl_2 on tbl.name = tbl2.name where tbl.type = 1 

Это, конечно, предполагает, что ваши две объединенные таблицы имеют одинаковую конфигурацию столбцов.

Использование Having не имеет смысла в этом случае, поскольку вы не выполняете агрегированный запрос.

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