2014-09-02 52 views
0

我有兩個表,一個國家前綴,另一個與調用。防止重複與MySQL的COUNT

前綴表可能是這樣的:

+------+-----------+-----------+ 
| id | country | prefix | 
+------+-----------+-----------+ 
| 1 |  USA | 1   | 
| 2 | canada | 1   | 
| 3 | spain | 4   | 
+------+-----------+-----------+ 

電話表:

+-----------+-------------------+ 
| id  | destination  | 
+-----------+-------------------+ 
|  1 |     1 | 
|  2 |     1 | 
|  3 |     4 | 
|  4 |    1441 | 
+-----------+-------------------+ 

我試着去找到多少每個國家的呼叫:

select count(*) as calls 
    from calls as t1 
inner join prefixes as t2 
    on t1.destination like CONCAT('%', t2.prefix) 

問題是美國和加拿大有相同的前綴,我得到了雙倍的結果,我也必須使用當前表格而不添加/編輯。

是否可以遍歷調用表,但只搜索每個前綴一次?

預期結果: 3個呼叫前綴1(美國/加拿大), 1個呼叫西班牙。

+1

由於無法區分美國和加拿大,有了這些表格,您無法瞭解每個國家/地區的定義電話數量。那麼你期望的結果是什麼? 1.兩次美國,一次西班牙; 2.兩次加拿大,一次是西班牙;一旦美國,曾經是加拿大和曾經是西班牙; 4.還有其他什麼? – mhafellner 2014-09-02 13:18:15

+0

謝謝,增加了預期的結果 – 2014-09-02 13:36:59

回答

1

與您的確切數據的另一種方法是:

select count(*) as calls, t2.country as country 
    from calls as t1 
left join 
(select group_concat(country) as country, prefix from prefixes group by prefix) as t2 
    on t1.destination like CONCAT(t2.prefix, '%') 
group by substring(t1.destination,1,1) 

其中產生以下結果:

| CALLS | COUNTRY | 
|-------|------------| 
|  3 | USA,Canada | 
|  1 |  Spain | 

在這裏你有相應的SQLFiddle

這種方法應該更快,因爲有更少的嵌套查詢。

1

我不明白你的調用表的最後一行。從你期望的結果,我想這是一個1,而不是1441嘗試:

select country, n_calls from 
(select destination, count(*) as n_calls from calls group by destination) as a 
left join 
(select group_concat(country) as country, max(prefix) as destination from country group by prefix) as b 
on a.destination=b.destination; 

這給我:

**country** **n_calls** 
    usa,canada  3 
    spain   1