2011-08-02 7 views
1

クエリを期待される結果を返すされていません。MySQLのクエリは、()

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 

結果:

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

を私が間違っていると思われるもの

summedTagsはタグの実際の合計にほとんど一致しません。例ではid_data 3109は0 + 1 = 2で間違っています。id_data 1956は0 + 0 = 2も間違っているなどを示しています。 何が間違っていますか?

ところで、私もHAVING SUM(id_tag IN (75, 12)) = 2を追加しようとしましたが、同様の結果が出ました。あなたがそれを必要とする場合

いくつかのより多くの余分な情報:

私は(id_dataに代表される、別のテーブルからのID)のデータの束を含むテーブルのtags_inserviceを持っており、データが異なるタグでタグ付けすることができます。 id_dataには0以上のid_tagがあるため、同じid_data値を持つ複数の行が存在する可能性があります。実際、同じid_tagに同じid_dataを複数回タグ付けすることが有効な場合もあります。

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

よく書かれた質問Julian。形式を愛して:) –

+0

ありがとう!私は長い質問を読むのが嫌いなので、「短くて甘い」方法を模索しようとしました:) – Julian

答えて

2

summedTagsが出現であるなどの問題がでグループによって引き起こされているようです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

これです!私が見ていた変わったケースは、繰り返しタグを付けたものでした。ありがとう! – Julian

0

あなたは多少加算ロジックを変更することができます:

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 
  • 構文を保証していないが正しい
+0

シンタックスとしては機能しなかった唯一のものはコメントでしたが...正確に私のクエリと同じ結果を得る:( – Julian