2013-10-24 1 views
-1

У меня есть 3 таблицы, которые содержат очень похожую информацию. Столами являются владельцы, менеджеры и сотрудники. Я пытаюсь извлечь информацию из всех трех таблиц, все еще понимая, из какой таблицы берутся записи. Я тоже не хочу дубликатов. Во всех таблицах есть адрес электронной почты, который относится к таблице email, к которой я присоединяюсь.MySQL: выберите из нескольких таблиц с полем, чтобы показать, в какой таблице была сделана запись.

Кроме того, очень вероятно, что email_id будет существовать в нескольких таблицах (т. Е. Электронное письмо может быть владельцем и менеджером, или все равно 3).

Вот то, что я до сих пор:

SELECT email 
FROM (
    (
     SELECT e.email 
     FROM `owners` as o 
     LEFT JOIN `email` as e 
     ON e.email_id = o.email_id 
     WHERE o.company_id = 3 
     GROUP BY e.email 
    ) 
    UNION ALL 
    (
     SELECT e.email 
     FROM `managers` as m 
     LEFT JOIN `email` as e 
     ON e.email_id = m.email_id 
     WHERE m.company_id = 3 
     GROUP BY e.email 
    ) 
    UNION ALL 
    (
     SELECT e.email 
     FROM `employees` as emp 
     LEFT JOIN `email` as e 
     ON e.email_id = emp.email_id 
     WHERE v.company_id = 3 
     GROUP BY e.email 
    ) 
) as `people` 
ORDER BY email ASC 

Этот запрос на самом деле работает отлично. Он удаляет дубликаты из таблиц отдельно, но сохраняет их в нескольких таблицах. Я до сих пор не знаю, из какой таблицы каждый из них. Я попытался изменить запрос к этому вопросу:

SELECT email, owner, manager, employee 
FROM (
    (
     SELECT e.email, 'yes' as owner 
     FROM `owners` as o 
     LEFT JOIN `email` as e 
     ON e.email_id = o.email_id 
     WHERE o.company_id = 3 
     GROUP BY e.email 
    ) 
    UNION ALL 
    (
     SELECT e.email, 'yes' as manager 
     FROM `managers` as m 
     LEFT JOIN `email` as e 
     ON e.email_id = m.email_id 
     WHERE m.company_id = 3 
     GROUP BY e.email 
    ) 
    UNION ALL 
    (
     SELECT e.email, 'yes' as employee 
     FROM `employees` as emp 
     LEFT JOIN `email` as e 
     ON e.email_id = emp.email_id 
     WHERE v.company_id = 3 
     GROUP BY e.email 
    ) 
) as `people` 
ORDER BY email ASC 

Это не сработало, потому что не все таблицы имели одинаковые столбцы. Если я добавлю все поля ко всем таблицам (т. Е. SELECT e.email, 'yes' as owner, '' as manager, '' as employee), запрос работает, но все таблицы имеют одинаковое поле. Не знаю, почему.

В конечном счете, я бы хотел, чтобы в возвращаемом наборе записей не было повторяющихся адресов электронной почты, и у каждой записи есть что-то вроде email = 'email address', owner = 'yes/no', manager = 'yes/no', employee = 'yes/no'.

Любые идеи о том, как это сделать? Если вам нужна дополнительная информация, просто прокомментируйте. Благодаря!

ответ

1

Добавить столбец «имя_таблицы» для каждого набора результатов, чтобы определить, какие таблицы результатов пришли из

(
    SELECT e.email, 'owners' as table_name 
    FROM `owners` as o 
    LEFT JOIN `email` as e 
    ON e.email_id = o.email_id 
    WHERE o.company_id = 3 
    GROUP BY e.email 
) 
UNION ALL 
(
    SELECT e.email, 'managers' as table_name 
    FROM `managers` as m 
    LEFT JOIN `email` as e 
    ON e.email_id = m.email_id 
    WHERE m.company_id = 3 
    GROUP BY e.email 
) 
UNION ALL 
(
    SELECT e.email, 'employees' as table_name 
    FROM `employees` as emp 
    LEFT JOIN `email` as e 
    ON e.email_id = emp.email_id 
    WHERE v.company_id = 3 
    GROUP BY e.email 
) 

В качестве альтернативы добавьте по 3 столбца к каждому блоку результатов. т.е. добавить * is_owner, is_manager, is_employee * в все 3 выберите блоки

+0

В качестве альтернативы добавить 3 колонки к каждому блоку результатов. т. е. добавить * is_owner, is_manager, is_employee * to * all * 3 select blocks – vogomatix

+0

И вы даже можете удалить круглые скобки! –

+0

Я действительно попытался добавить 3 столбца к каждому блоку результатов, и он работает некорректно. Можете ли вы показать пример этого? – Chris

0

Вы можете сделать это, заставляя значение в каждой строке следующим образом:

select t1.field1, t1.field2, 'YourFirstTable' as fromTable from t1 
union all 
select t2.field1, t2.field2, 'YourSecondTable' from t2 

Если вы хотите удалить дубликаты из набора всего результата (где на «удаление дубликатов» Я понимаю, что вы хотите, чтобы письмо от любого таблиц), вы должны обернуть, что во внешнем запросе и применить группу по:

select field1, field2, max(fromTable) 
    select t1.field1 as field1, t1.field2 as field2, 'YourFirstTable' as fromTable from t1 
    union all 
    select t2.field1, t2.field2, 'YourSecondTable' from t2 
group by field1, field2 
0
 SELECT e.email,"owners" AS people 
     FROM `owners` as o 
     LEFT JOIN `email` as e 
     ON e.email_id = o.email_id 
     WHERE o.company_id = 3 
     GROUP BY e.email 
    UNION ALL 
     SELECT e.email,"managers" AS people 
     FROM `managers` as m 
     LEFT JOIN `email` as e 
     ON e.email_id = m.email_id 
     WHERE m.company_id = 3 
     GROUP BY e.email 
    UNION ALL 
     SELECT e.email,"employees" AS people 
     FROM `employees` as emp 
     LEFT JOIN `email` as e 
     ON e.email_id = emp.email_id 
     WHERE v.company_id = 3 
     GROUP BY e.email;