2015-09-07 2 views
0

у меня есть эти две таблицыНе удается соединить две таблицы должным образом в MySQL

N-table       M-table 
----------------------------- ----------------------------- 
| date  | id | n-value | | date  | id | m-value | 
|------------|----|---------| |------------|----|---------| 
| 2015-08-01 | 7 | 100  | | 2015-09-01 | 7 | 200  | 
| 2015-09-01 | 8 | 10  | ----------------------------- 
----------------------------- 

Я хотел бы присоединиться эти две таблицы, как этот

--------------------------------------------------- 
| date  | id | n-value  | m-value  | 
-------------|----|---------------|---------------| 
| 2015-08-01 | 7 | 100   | null (or 0) | 
| 2015-09-01 | 7 | null (or 0) | 200   | 
| 2015-09-01 | 8 | 10   | null (or 0) | 
--------------------------------------------------- 

Я сделал этот запрос:

SELECT n.date , n.id , n.n-value, m.m-value FROM n 
    LEFT JOIN m ON n.id = m.id AND n.date = m.date GROUP BY n.date 

Но выход неправильный:

--------------------------------------------------- 
| date  | id | n-value  | m-value  | 
-------------|----|---------------|---------------| 
| 2015-08-01 | 7 | 100   | null   | 
| 2015-09-01 | 8 | 10   | null   | 
--------------------------------------------------- 

Что случилось с моим запросом?

+0

Если вы используете символ - (минус) в имени столбца, то вам нужно будет запрограммировать имена в запросе: m.'m-value', иначе оно будет рассматриваться как выражение «mm - value» " – PaulF

ответ

1

Если вы были на ANSI SQL RDBMS, то вы бы:

SELECT n.date , n.id, m.id , n.n-value, m.m-value FROM n 
    FULL OUTER JOIN m ON n.id = m.id AND n.date = m.date GROUP BY n.date 

Это выбирает результаты оба таблицы, когда нет никакого совпадения.

Левое внешнее соединение берет все элементы слева и включает в себя нули, где совпадение справа и правое внешнее соединение не противоположное. Полный включает обе стороны.

Обратите внимание, что вам также необходимо включить m.id, как для средней строки в вашей «ожидаемой» таблице, нет n.id.

Однако, MySql, как указывалось не поддерживает полное внешнее соединение, так что вы можете использовать (как указано в ссылке в комментариях ниже)

SELECT n.date , n.id, n.n-value, m.m-value FROM n 
    LEFT JOIN m ON n.id = m.id AND n.date = m.date GROUP BY n.date 
UNION 
SELECT m.date , m.id , n.n-value, m.m-value FROM n 
    RIGHT JOIN m ON n.id = m.id AND n.date = m.date GROUP BY n.date 
+0

MySQL не поддерживает полное внешнее соединение: http://stackoverflow.com/questions/4796872/full-outer-join-in-mysql – PaulF

+0

Спасибо! Hovewer вы можете взять только те записи с (например) id 7 с тем, где только предложение? Или мне нужно написать предложение where в обоих вариантах? Я пытаюсь избежать этого действия. – Mc89

+0

К сожалению, вы делаете союз, это фактически два SQL-запроса с соответствующим столбчатым выходом. Я отредактировал мой SQL, чтобы включить только «Id» со стороны, которая была внешней. –

0

Вы должны сказать запрос поставить право содержимое таблицы в верхней строке, но организовано так, как вы хотите.

+0

Дело в том, что я должен выполнить запрос, который может быть выполнен в обеих таблицах, несмотря на их длину записи. В этом случае у меня есть 2 записи против 1 записи, но в будущем, например, будет 4 против 6. – Mc89

+0

@ Mc89 У меня хорошая логистика, но, к сожалению, я не понимаю MySQL. Поместите каждую таблицу идентификатором, чтобы их можно было назвать ссылкой на их идентификатор, а затем создать третью таблицу, которая является объединением двух других, и добавить третий уникальный идентификатор. Создайте цикл, который вызывается каждую минуту или около того, который обновляет содержимое третьей таблицы относительно других. – Gustavo6046

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