2017-02-23 6 views
0

Je construis un résumé dans une table que j'auto-joins pour compter les lignes correspondant à certaines valeurs (dans TikiWiki CMS, application tracker). Mais j'ai un cas où il y a deux colonnes qui peuvent avoir les mêmes valeurs, et j'ai besoin de SQL pour prendre la première valeur non-NULL dans un ordre spécifique.MySQL sélectionne des valeurs non-NULL avec COALESCE ou IFNULL dans une instruction WHERE

Voici un exemple de la table tiki_tracker_item_fields où je travaille:

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

Dans la requête que je veux compter toutes les lignes qui ont « Paris » comme valeur, que ce soit dans le champ ID 236 ou d'un champ ID 213. le résultat devrait être ici: 3.

Il est ma demande:

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

Alors cela fonctionne quand j'ai « Paris » pour le champ 236, mais pas quand j'ai Paris pour le champ 21 3.

Et je ne suis même pas sûr que je pourrais utiliser COALESCE de cette façon, tous les exemples que j'ai trouvés mettent COALESCE dans l'instruction SELECT.

Ensuite, il y a les problèmes de performance ...

Répondre

2

Vous pouvez utiliser count (distinct) avec un case:

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

Great! Fonctionne comme un charme, et est rapide. Merci! Maintenant, je dois entourer votre exemple pour comprendre comment cela fonctionne en particulier la partie 'THEN itemId END'. –

+0

Aussi, j'aimerais savoir s'il est possible/conseillé d'utiliser les fonctions de flux de contrôle dans une instruction WHERE ... –