2016-10-13 7 views
0

GROUP BYを使用して一意の呼び出し元IDのみを表示する電話呼び出しのクエリがあります。問題は、発信者が発信者IDをブロックしている場合、発信者IDが「不明」と表示され、クライアントがすべての未知数を一緒に集計したくないということです。だから、基本的には、ちょうどGROUP BY caller_idの代わりに何とか何かをする必要がありますGROUP BY caller_id IF caller_id != 'Unknown'MySQL GROUP BY列で特定の値を無視する

これも可能ですか?可能であれば、PHPですべてのグループ処理をしないでください。

+1

での議論AFTER EDITはこのためにWHERE文ではありませんか? – MikeVelazco

+0

VladoDemcakの答えは大丈夫です...それはあなたのために働くのですか? – Roberto

答えて

2

あなたのような何かを行うことができます:

SELECT caller_id FROM phone_calls WHERE caller_id != 'Unknown' GROUP BY caller_id;

またはDISTINCTを考える - ほとんどの場合、それが高速です - あなたが持っている場合caller_idパフォーマンス上に作成しインデックスは通常は同じですが、もしDISTINCTは優れていません。あなたが必要な場合:

...ショーだけのユニークな発信者のID ..

多分あなたのケース(やって凝集や似たような)のために、あなたはそれを使用することができませんが、念のため。

SELECT DISTINCT caller_id FROM phone_calls WHERE caller_id != 'Unknown';

- コメント

SELECT * FROM callers;                                                
+----+-----------+-----------+                                                   
| id | caller_id | call_time |                                                   
+----+-----------+-----------+                                                   
| 1 | abc  |  24 |                                                   
| 2 | abc  |  16 |                                                   
| 3 | xyz  |  10 |                                                   
| 4 | xyz  |  10 |                                                   
| 5 | Unknown |  11 |                                                   
| 6 | Unknown |  12 |                                                   
| 7 | Unknown |  13 |                                                   
| 8 | xyz  |   1 |                                                   
| 9 | abc  |  10 |                                                   
+----+-----------+-----------+ 

SELECT caller_id, SUM(call_time) FROM callers 
WHERE caller_id != 'Unknown' 
GROUP BY caller_id;                              
+-----------+----------------+                                                   
| caller_id | SUM(call_time) |                                                   
+-----------+----------------+                                                   
| abc  |    50 |                                                   
| xyz  |    21 |                                                   
+-----------+----------------+                                                   

SELECT caller_id, SUM(call_time) FROM callers 
GROUP BY caller_id;                                     
+-----------+----------------+                                                   
| caller_id | SUM(call_time) |                                                   
+-----------+----------------+                                                   
| abc  |    50 |                                                   
| Unknown |    36 |                                                   
| xyz  |    21 |                                                   
+-----------+----------------+                                                   

SELECT caller_id, SUM(call_time) as total_time FROM callers 
WHERE caller_id != 'Unknown' 
GROUP BY caller_id 
UNION 
SELECT caller_id, call_time FROM callers 
WHERE caller_id = 'Unknown';        
+-----------+------------+                                                    
| caller_id | total_time |                                                    
+-----------+------------+                                                    
| abc  |   50 |                                                    
| xyz  |   21 |                                                    
| Unknown |   11 |                                                    
| Unknown |   12 |                                                    
| Unknown |   13 |                                                    
+-----------+------------+                                                    

SELECT caller_id, SUM(call_time) as total_time FROM callers 
GROUP BY caller_id, 
     (case when caller_id = 'Unknown' 
     AND id is not null 
     then id end 
     );                 
+-----------+------------+                                                    
| caller_id | total_time |                                                    
+-----------+------------+                                                    
| abc  |   50 |                                                    
| Unknown |   11 |                                                    
| Unknown |   12 |                                                    
| Unknown |   13 |                                                    
| xyz  |   21 |                                                    
+-----------+------------+ 
+0

集約を行っているため、DISTINCTは機能しません。そして、私たちは依然としてUnknown呼び出しをそれぞれのグループとして表示する必要があります(呼び出し元IDがUnknownの各呼び出しがCOUNTが1の結果に表示されます)。WHERE句を使用すると完全に削除されます。 Caller_idがUnknownでコールを選択し、その2番目のクエリでグループ化していない2番目のクエリを作成した場合は、これはうまくいくでしょう。 – awestover89

+1

これで本当に必要なものがわかりました。 1つの可能性がありますが、今ではテストできませんが、caller_idでグループ化してみてください(caller_id = 'Unknown'でunique_colがnullでなくunique_col endの場合); " Unknownグループには一意の列が必要です。それ以外の場合は、2つの選択と結合が必要になると思います。 – VladoDemcak

+1

@ awestover89私の答えを確認してください私は例を追加しましたそれはあなたのために面白いだろう – VladoDemcak