2013-10-24 63 views
-1

我有3个表,其中包含非常相似的信息。这些表格是业主,经理和员工。我试图从所有3张表中提取信息,同时仍然了解每条记录来自哪个表。我也不想重复。所有表格都有一个email_id,它与我加入的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

添加“表格名”列每组结果来确定哪些表中的结果从

0123来了
(
    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 *到*全部* 3选择块 – 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; 
相关问题