Объединение объединить две таблицы (MySQL) - PullRequest
0 голосов
/ 15 декабря 2018

Я хочу отфильтрованную таблицу (tableA) с другой таблицей (tableB).

Код, который я использовал для получения результата для tableA

select c.id, a.conversation_id, a.tag, c.email, c.created_at
from conversation c
right join (select * from conversation_tag
where tag = 'atlas-interest') as a
on a.conversation_id = c.id;

tableA

enter image description here

tableB

enter image description here

Я хочу внешнее объединение этих двух таблиц по "электронной почте",Тем не менее, у меня постоянно возникает проблема с синтаксисом
Мой код

select * from contact con
LEFT JOIN (select c.id, a.conversation_id, a.tag, c.email, c.created_at
from conversation c
right join (select * from conversation_tag
where tag = 'atlas-interest') as a
on a.conversation_id = c.id)) ON con.email = cc.email
UNION 
select * from con
RIGHT JOIN (select c.id, a.conversation_id, a.tag, c.email, c.created_at
from conversation c
right join (select * from conversation_tag
where tag = 'atlas-interest') as a
on a.conversation_id = c.id)) on con.email = cc.email;

Мой другой вопрос: код легко запутывается во вложенном выборе. Есть ли способ сохранить таблицу A как переменную и простовызвать переменную при присоединении к tableB?
Я нашел этот метод SET @v1 := (SELECT COUNT(*) FROM user_rating);, но кажется, что он может сохранить только один столбец за раз.

Ответы [ 3 ]

0 голосов
/ 15 декабря 2018

Это не ответ, но слишком длинный для комментария.Что касается вашего первого запроса ...

select c.id, a.conversation_id, a.tag, c.email, c.created_at
from conversation c
right join (select * from conversation_tag
where tag = 'atlas-interest') as a
on a.conversation_id = c.id;

Мы обычно не используем RIGHT OUTER JOIN, потому что они труднее читать, чем левые внешние соединения.В конце концов вы выбираете conversation_tag строк с tag = 'atlas-interest' и внешнее соединение их conversation строк.Но почему вы даже внешнее присоединение?Как может быть conversation_tag без связанного conversation?Это означало бы, что база данных повреждена (из-за отсутствия внешнего ключа).

При этом ваш запрос должен быть просто:

select *
from conversation_tag ct
join conversation c on c.id = ct.conversation_id
where ct.tag = 'atlas-interest';
0 голосов
/ 15 декабря 2018

Ваш первый запрос может быть упрощен до:

select c.id, ct.conversation_id, ct.tag, c.email, c.created_at
from conversation c join
     conversation_tag ct
     on ct.conversation_id = c.id
where ct.tag = 'atlas-interest';

Я сомневаюсь, что у вас есть какие-либо conversation_id в conversation_tag, которые не соответствуют.

Далее вы хотите полныйвнешнее соединение на con.Для этого соберите все электронные письма и используйте left join s:

select ct.*, con.*
from ((select c.email
       from con c
      ) union  -- on purpose to remove duplicates
      (select c.email
       from conversation c join
            conversation_tag ct
            on ct.conversation_id = c.id
       where ct.tag = 'atlas-interest'
      )
     ) e left join
     con
     on e.email = con.email left join
     (select c.id, ct.conversation_id, ct.tag, c.email, c.created_at
      from conversation c join
           conversation_tag ct
           on ct.conversation_id = c.id
      where ct.tag = 'atlas-interest'
     ) ct
     on e.email = ct.email;

Хак left join / right join / union просто не очень связан с настоящим full join.Например, удаляются дубликаты.

0 голосов
/ 15 декабря 2018

Вы пропустили псевдонимы cc для подзапросов.

SELECT * FROM contact con
LEFT JOIN (
     SELECT c.id, a.conversation_id, a.tag, c.email, c.created_at
     FROM conversation c
     RIGHT JOIN (
           SELECT * FROM conversation_tag
           WHERE tag = 'atlas-interest') AS a
     ON a.conversation_id = c.id
) AS cc ON con.email = cc.email
UNION 
     SELECT c.id, a.conversation_id, a.tag, c.email, c.created_at
     FROM conversation c
     RIGHT JOIN (
           SELECT * FROM conversation_tag
           WHERE tag = 'atlas-interest') AS a
     ON a.conversation_id = c.id
) AS cc ON con.email = cc.email

Чтобы избежать необходимости повторять подзапрос, вы можете определить представление:

CREATE VIEW atlas_conversations AS
SELECT c.id, a.conversation_id, a.tag, c.email, c.created_at
FROM conversation c
RIGHT JOIN (
    SELECT * FROM conversation_tag
    WHERE tag = 'atlas-interest'
) AS a ON a.conversation_id = c.id;

Тогда вы можетеделать:

SELECT *
FROM contact AS con
LEFT JOIN atlas_conversations AS cc ON con.email = cc.email
UNION
SELECT *
FROM contact AS con
RIGHT JOIN atlas_conversations AS cc ON con.email = cc.email
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...