2011-04-04 83 views
1

我想查询3个大多数不相关的表。所有三个关系都是一列(一个电子邮件地址字段)。我创建了一个'union all',并从所有3个表中拉出了电子邮件,然后在最后分组以确保没有重复(我也尝试过联盟)。MySQL联盟,表优先级和虚假列

我的问题是,它一切正常,但我需要知道每个电子邮件地址是第一个表上的1,0或NULL。我已经尝试拉列,然后添加到'“”AS Col1'到其他表(避免错误1222,匹配列)。我可以从表1中得到由表2“无”改写由没有在表3

这里做到这一点,但是数据,然后再是查询:

SELECT * FROM (
SELECT email AS emails, COUNT(email) AS qty, '' AS custCountry, '' AS custID, '' AS cName, active AS newsletter 
    FROM newsletter 
    WHERE email != '' 
    GROUP BY email 

UNION ALL 

SELECT email AS emails, COUNT(email) AS qty, '' AS custCountry, '' AS custID, '' AS cName, '' AS newsletter 
    FROM orders 
    WHERE email != '' 
    GROUP BY email 

UNION ALL 

SELECT email AS emails, COUNT(email) AS qty, country AS custCountry, customerID AS custID, countries.name AS cName, '' AS newsletter 
    FROM customers 
     LEFT JOIN countries ON customers.country = countries.zoneID 
    WHERE email != '' 
    GROUP BY email 
) AS newtable 

GROUP BY emails 
ORDER BY qty DESC 

它的工作,直到我加入“活跃'列,在此时它会覆盖活动列中的任何内容。我需要第三张表,因为它需要保留我需要的位置数据。如果我要将第一个表格放到最后,它会给我“活动”,但会覆盖位置列。

我不是MySQL的亲(看看!)所以任何帮助非常感谢。

回答

0

你试图解决什么问题? 你想要所有3个表格中唯一的电子邮件地址列表吗? 如果是的话,你可以使用这个:

select email from A union select email from B union select email from C

分组是不是在你的代码片段正确。对于group by查询,您可以只有select子句中的那些列出现在group by子句中,或者是聚合函数,如min(), max(), avg(),count()

MySQL不会为此引发错误,但会在无效中显示一些随机值colu。其他数据库,即Oracle会引发错误。

+0

感谢Priyank。我可以得到一个合并的电子邮件地址列表,但是一个表有一列我想从中提取数据。当我使用union时,所有的选择都需要有相同的列数,所以我需要伪装它们。问题在于最后选择的假表将覆盖第一个和第二个中的信息。 – 2011-04-05 08:22:54

+0

我想我需要一种向虚假列添加任何内容的方式,以便它不会覆盖第一个数据。 一个解决方案是将表中的实际数据放在实际列中,以便它不会被覆盖,但最后一个表将数据从真实列中拉出来。因此,他们也会被覆盖。 – 2011-04-05 08:25:51

0

好的。真的很简单。只需加入你需要的数据选择表的联合。这是非常明显的,可能难以尝试解释我的问题,而不是继续进行分类。不过谢谢。