2014-12-09 2 views
0

Как объединить эти две таблицы вместе?MySQL соединяет две таблицы, когда одна таблица не имеет строки

type count 
NULL 117 
2 1 

type count 
NULL 807 
1 3 
2 32 

Я попытался INNER JOIN, LEFT JOIN и RIGHT JOIN, и я не могу вполне понять это. Я хотел бы конечный результат, чтобы выглядеть

type count count 
NULL 117 807 
1 NULL 3 
2 1  32 

ответ

1

У вас есть проблема, потому что NULL s не совпадают по умолчанию. Но вы можете заставить их соответствовать. Позвольте мне считать, во-первых, t1 и второй t2

select t2.type, t1.count, t2.count 
from t2 left join 
    t1 
    on t2.type = t1.type or (t2.type is null and t1.type is null); 

Here является SQL Скрипки, который показывает, что это правильно отвечает на вопрос OP еще.

+0

И если 't1' имеет' type' это не в 't2'? – Madbreaks

+0

@Madbreaks. , , Это не похоже на этот конкретный вопрос. Если вы хотите задать такой вопрос, я предлагаю вам сделать это как вопрос, а не в комментарии. –

+0

Основываясь на характере вопроса о op, я считаю, что полный ответ разрешил бы такой сценарий. – Madbreaks

0
SELECT * FROM t1 
LEFT JOIN t2 ON t1.id = t2.id 
UNION 
SELECT * FROM t1 
RIGHT JOIN t2 ON t1.id = t2.id 

Sourced from this question

+0

Если вы запустите это в SQL Fiddle в моем примере, вы увидите, что он не дает результатов, которые хочет OP. –

0

Право тип соединения будет FULL OUTER JOIN, но она не существует в MySQL. Мы можем подражать его следующим образом:

SELECT t1.type, t1.count, t2.count # exact matches 
FROM t1 join t2 on t1.type = t2.type 
UNION 
select t1.type, t1.count, NULL  # t2 not present 
FROM t1 left join t2 on t1.type = t2.type 
WHERE t2.type IS NULL 
UNION 
select t2.type, NULL, t2.count  # t1 not present 
FROM t2 left join t1 on t2.type = t1.type 
WHERE t1.type IS NULL 
UNION 
select NULL, t1.count, t2.count # NULL on both sides 
FROM t1, t2 
WHERE t1.type IS NULL and t2.type IS NULL; 
0

У меня есть вопрос по этому вопросу;)

Что произойдет, если таблицы будет выглядеть следующим образом? (Только небольшие изменения)

type count 
NULL 117 
3 333 
2 1 

type count 
NULL 807 
1 3 
2 32 

Потому что в этом случае обе таблицы содержат записи, которые не соответствуют другой таблицы, так что, возможно, присоединение с одного направления не хватает и вам нужно соединить таблицы с обеих сторон, но то, возможно, возникли проблемы с использованием данных для «типа» только с одной таблицы ...

Так одно решение может быть что-то вроде:

select if (t1.type is null, t2.type, t1.type) as type, t1.count count1, t2.count count2 
    from t1 
    left join t2 
    on t1.type=t2.type or (t1.type is NULL and t2.type is NULL) 
union 
select if (t1.type is null, t2.type, t1.type) as type, t1.count count1, t2.count count2 
    from t1 
    right join t2 
    on t1.type=t2.type or (t1.type is NULL and t2.type is NULL); 

Кроме того,

  • вы также можете использовать функцию coalesce() вместо if (.. is null, ...), например. coalesce(t1.type, t2.type)
  • вам, возможно, нужно быть осторожным с union, возможно, вы хотите сохранить дублированные записи (если есть) и использовать union all

http://www.sqlfiddle.com/#!2/302e69/2

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