2017-02-23 259 views
0

我正在自我连接的表中创建摘要,以便对特定值(在TikiWiki CMS,跟踪器应用程序)中对应的行进行计数。但是我有一个情况,其中有两列可以具有相同的值,并且我需要SQL以特定顺序获取第一个非NULL值。MySQL在WHERE语句中使用COALESCE或IFNULL选择非NULL值

下面是表tiki_tracker_item_fields在我工作的一个例子:在字段Id 236或ID字段213

itemId | fieldId | value 
========================== 
41  | 236  | Paris 
41  | 213  | Paris 
14  | 236  |   
14  | 213  | Paris 
25  | 236  | Paris  
25  | 213  |  

在我想算有“巴黎”作为值的所有行查询,无论是。这里的结果应该是:3

有我的要求:

SELECT COUNT(*) AS sp_actions   
FROM          
    `tiki_tracker_item_fields` AS actions 
WHERE         
    COALESCE(        
    actions.fieldId = 236,    
    actions.fieldId = 213    
)          
AND actions.value = 'Paris'     

所以这个作品时,我有“巴黎”现场236,而不是当我有巴黎21场3.

而且我甚至不确定我可以使用COALESCE这种方式,我发现所有示例都将SELECT语句中的COALESCE。

再就是性能问题...

回答

2

可以使用count (distinct)case

select 
    count(distinct case when value = 'Paris' then itemId end) cnt 
from `tiki_tracker_item_fields` 
where fieldId in (236,213); 
+0

太好了!像魅力一样工作,速度很快。谢谢!现在我必须围绕你的例子来理解它是如何工作的,特别是'THEN itemId END'部分。 –

+0

另外我想知道是否有可能/建议在WHERE语句中使用控制流功能... –