Как объединить результат из двух таблиц с одним и тем же полем в одно поле? - PullRequest
5 голосов
/ 29 ноября 2010

У меня есть такие таблицы:

   Table1                Table2
   name1 | link_id      name2  |  link_id
   text       1         text         2
   text       2         text         4

И я хочу получить результат:

name1     name2     link_id
text      text         1
text      text         2
text      text         4

Как я могу это сделать?

ДОБАВИТЬ: Извините, мойАнглийский в не хорошо.У меня есть таблицы device, device_model и device_type с повторяющимся полем counter_set_id.Я хочу выбрать поля из counter_set со всеми значениями counter_set_id.Мне нужно получить значения только из полей counter_set_id

Теперь у меня есть этот запрос:

SELECT  `dev`.`counter_set_id`, `mod`.`counter_set_id`, `type`.`counter_set_id`
FROM    `device` AS `dev`
LEFT JOIN   `device_model` AS `mod` ON `dev`.`device_model_id` = `mod`.`id`
LEFT JOIN   `device_type` AS `type` ON `mod`.`device_type_id` = `type`.`id`
WHERE   `dev`.`id` = 4;

Это возвращает 3 столбца, но мне нужны все значения в одном столбце

ЭтоОкончательный вариант я думаю:

SELECT  `dev`.`counter_set_id`
FROM        `device` AS `dev` LEFT OUTER JOIN
        `device_model` AS `mod` ON `dev`.`device_model_id` = `mod`.`id`
WHERE   `dev`.`id` = 4 AND
        `dev`.`counter_set_id` IS NOT NULL
UNION
SELECT  `mod`.`counter_set_id`
FROM        `device_model` AS `mod` LEFT OUTER JOIN
        `device` AS `dev` ON `mod`.`id` = `dev`.`device_model_id`
WHERE   `mod`.`counter_set_id` IS NOT NULL;

Ответы [ 7 ]

7 голосов
/ 29 ноября 2010

Исходя из предоставленных вами таблиц сэмплов и желаемого результата, может показаться, что вам может понадобиться FULL OUTER JOIN.Не все поставщики реализуют это, но вы можете смоделировать это с помощью соединения LEFT OUTER и соединения UNION to EXCEPTION с таблицами, обратными следующим образом:

Select name1, name2, A.link_id
From table1 A Left Outer Join
     table2 B on A.link_id = B.link_id
Union
Select name1, name2, link_id
From table2 C Exception Join
     table1 D on C.link_id = D.link_id

тогда ваш вывод будет выглядеть так:

NAME1   NAME2    LINK_ID
=====   =====    =======
text    <NULL>         1
text    text           2
<NULL>  text           4
4 голосов
/ 29 ноября 2010

Сначала я думал, что объединение будет работать, но теперь я не уверен ... Я думаю, что объединение какого-то типа.

Честно говоря, это плохой дизайн имо.

select * from table1
union
select * from table2
3 голосов
/ 29 ноября 2010

Я предполагаю, что вы присоединяетесь к полю link_id.Обычное соединение приведет к возвращению четырех строк (две из которых идентичны).То, что вы на самом деле просите, это не объединение полей, а получение только отдельных строк.

Просто используйте ключевое слово distinct:

select distinct t1.name1, t2.name2, t1.link_id
from Table1 as t1
inner join Table2 as t2
    on t1.link_id = t2.link_id
1 голос
/ 29 ноября 2010

Выберите все идентификаторы во временной таблице (однако это работает в MySQL - CTE в SQL Server) и используйте ее в качестве присоединяющейся таблицы.

1 голос
/ 29 ноября 2010

Если вы не хотите повторять результат поля, используйте GROUP BY link_id в конце вашего запроса

Если вы хотите показать только link_id поле, тогда:

SELECT DISTINCT ta.link_id
FROM tblA AS ta
INNER JOIN tblB AS tb
ON ta.link_id = tb.link_id

Также ищите CONCAT, CAST и другие полезные функции в руководстве по mysql. Я надеюсь, что это поможет вам.

1 голос
/ 29 ноября 2010

Если три столбца имеют одинаковое значение, просто

SELECT  `type`.`counter_set_id`
FROM ...

Или, что еще лучше, если они имеют одинаковое значение, вы можете сделать:

SELECT  `dev`.`counter_set_id`
FROM    `device` AS `dev`
WHERE   `dev`.`id` = 4;

Если вы хотитечтобы объединить их (поместить их все в одно поле), используйте это:

SELECT  CONCAT(
   CAST(`dev`.`counter_set_id` AS CHAR),
   ',',
   CAST(`mod`.`counter_set_id` AS CHAR),
   ',',
   CAST(`type`.`counter_set_id` AS CHAR))
FROM ...
1 голос
/ 29 ноября 2010

Какое значение link_id 4 имеет для name1?Какое значение link_id 1 имеет для name2?

Попробуйте поискать различные типы JOIN ..

http://dev.mysql.com/doc/refman/5.0/en/join.html

Возможно, я неправильно понял вопрос под рукой - извините.

ура

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...