2011-04-04 85 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

好的。真的很簡單。只需加入你需要的數據選擇表的聯合。這是非常明顯的,可能難以嘗試解釋我的問題,而不是繼續進行分類。不過謝謝。