2011-08-02 3 views
1

La requête:requête MySQL avec SOMME() ne retourne pas les résultats attendus

SELECT 
    id_data, 
    id_tag IN (75) AS tag1, 
    id_tag IN (12) AS tag2, 
    SUM(id_tag IN (75, 12)) summedTags 
FROM 
    tags_inservice 
WHERE id_service = 1 
GROUP BY id_data 
ORDER BY summedTags DESC 

Le résultat:

id_data tag1 tag2 summedTags 
------- ------ ------ ---------- 
    3109  0  1   2 
    1956  0  0   2 
    1928  0  0   1 
    2738  1  0   1 

Ce que je pense est faux:

Le summedTags correspond rarement à la somme réelle des tags! Dans l'exemple id_data 3109 a 0 + 1 = 2 qui est faux, et id_data 1956 montre 0 + 0 = 2 ce qui est faux aussi, etc, etc Qu'est-ce que je fais mal? Par ailleurs, j'ai également essayé d'ajouter HAVING SUM(id_tag IN (75, 12)) = 2 avec des résultats similaires.

Quelques infos plus supplémentaires si vous en avez besoin:

J'ai un tags_inservice de table qui contient un tas de données (représentés par id_data, un identifiant d'une autre table) et les données peuvent être marquées par différentes balises . Un id_data peut avoir zéro ou plusieurs id_tags, donc il pourrait y avoir plus d'une ligne avec la même valeur id_data. En fait, il est parfois possible d'avoir le même identifiant id_data avec le même id_tag ​​plus d'une fois.

DESCRIBE tags_inservice; 

Field  Type  Null Key  Default Extra   
---------- ------- ------ ------ ------- -------------- 
id_intag int(11) NO  PRI  (NULL) auto_increment 
id_tag  int(11) YES  MUL  (NULL)     
id_service int(11) YES  MUL  (NULL)     
data_type int(11) YES    (NULL)     
id_data  int(11) YES  MUL  (NULL)     
+0

Question bien écrite Julian. J'adore le format :) –

+0

Merci! Je déteste lire de longues questions donc j'ai essayé de chercher un moyen de le rendre "plus court et plus doux" :) – Julian

Répondre

2

semble que le problème est causé par groupe par comme summedTags est les occurrences de id_data

SELECT 
id_data, 
sum(if (id_tag=75,1,0)) as tag1, 
sum(if (id_tag=12,1,0)) as tag2, 
sum(if (id_tag in(12,75),1,0)) as summedTags 
FROM tags_inservice 
WHERE id_service = 1 
GROUP BY id_data 
ORDER BY summedTags DESC; 
+0

Les affaires étranges que je voyais étaient celles qui avaient une étiquette répétée. – Julian

0

Vous pouvez changer la logique de sommation peu:

SELECT 
    id_data, 
    CASE WHEN id_tag = 75 THEN 1 ELSE 0 END as tag1 , // id_tag IN (75) AS tag1, 
    CASE WHEN id_tag = 12 THEN 1 ELSE 0 END AS tag2 , // id_tag IN (12) AS tag2, 
    SUM (CASE WHEN id_tag = 75 OR id_tag = 12 THEN 1 ELSE 0 END) AS summedTags 
FROM 
    tags_inservice 
WHERE id_service = 1 
GROUP BY id_data 
ORDER BY summedTags DESC 
  • ne garantissant pas la syntaxe est correcte
+0

en ce qui concerne la syntaxe la seule chose qui n'a pas fonctionné était les commentaires (que j'ai enlevé) mais ... Obtenez EXACTEMENT les mêmes résultats qu'avec ma requête :( – Julian

Questions connexes