2011-01-31 42 views
2

我可以從兩個不同的列中選擇不同的值,但不知道如何計算它們。 我的猜測是我應該使用別名,但無法弄清楚如何正確寫入語句。如何統計SQL union中的不同值?

$sql = "SELECT DISTINCT author FROM comics WHERE author NOT IN 
       (SELECT email FROM bans) UNION 
       SELECT DISTINCT email FROM users WHERE email NOT IN 
       (SELECT email FROM bans) "; 

EDIT1:我知道我可以在PHP中使用mysql_num_rows(),但我認爲,需要太多的處理。

回答

12

你可以包裹查詢在子查詢:

select count(distinct author) 
from (
     SELECT author 
     FROM comics 
     WHERE author NOT IN (SELECT email FROM bans) 
     UNION ALL 
     SELECT email 
     FROM users 
     WHERE email NOT IN (SELECT email FROM bans) 
     ) as SubQueryAlias 

有在查詢兩個distinct s和union過濾掉重複。我刪除了所有三個(非不同的聯合爲union all),並用count(distinct author)將清晰度移至外部查詢。

+0

然後使用'select count(distinct something)'並將作者和電子郵件別名爲某個東西。 – chx

+0

@chx:聯合的最上部分確定列名稱。在這種情況下,該列的名稱將爲'author' – Andomar

+0

UNION「ALL」+1! – hasan83

3

你總是可以做SELECT COUNT(*) FROM (SELECT DISTINCT...) x,只需將UNION複製到第二個SELECT(更準確地說,它被稱爲匿名視圖)。

+0

我認爲我試圖做類似的事情,但事實是在兩個表中都出現了一些值,所以它們會被計算兩次,而且我只需要計數一次。 – grizwako