2012-04-04 8 views
2

何らかの理由で以下のクエリで重複する名前が許可されています。何故ですか?sqlクエリが正しくグループ化されていません

SELECT id, name_without_variants, SUM(relevance) as total_relevance FROM (
    SELECT 
     card_definitions.id, 
      card_definitions.name_without_variants, 
     (MATCH(card_definitions.name_without_variants) AGAINST ('lost soul site discard')) * 0.40 AS relevance 
     FROM card_definitions 
     GROUP BY name_without_variants, id 
    UNION 
    SELECT 
     card_definitions.id, 
      card_definitions.name_without_variants, 
     (MATCH(card_def_identities.special_ability_text) AGAINST ('lost soul site discard')) * 0.05 AS relevance 
     FROM card_def_identities 
     INNER JOIN card_definitions ON card_def_identities.card_def_sid = card_definitions.id 
     GROUP BY name_without_variants, id 
    UNION 
    SELECT 
     card_definitions.id, 
      card_definitions.name_without_variants, 
     (MATCH(brigades.brigade_color) AGAINST ('lost soul site discard')) * 0.30 AS relevance 
     FROM brigades 
     INNER JOIN card_def_brigades ON brigades.id = card_def_brigades.brigade_sid 
     INNER JOIN card_definitions ON card_def_brigades.card_def_sid = card_definitions.id 
     GROUP BY name_without_variants, id 
    UNION 
    SELECT 
     card_definitions.id, 
      card_definitions.name_without_variants, 
     (MATCH(identifiers.identifier) AGAINST ('lost soul site discard')) * 0.20 AS relevance 
     FROM identifiers 
     INNER JOIN card_def_identifiers ON identifiers.id = card_def_identifiers.identifier_sid 
     INNER JOIN card_definitions on card_def_identifiers.card_def_sid = card_definitions.id 
     GROUP BY name_without_variants, id 
    UNION 
    SELECT 
     card_definitions.id, 
      card_definitions.name_without_variants, 
     (MATCH(card_effects.effect) AGAINST ('lost soul site discard')) * 0.05 AS relevance 
     FROM card_effects 
     INNER JOIN card_def_effects ON card_effects.id = card_def_effects.effect_sid 
     INNER JOIN card_definitions on card_def_effects.card_def_sid = card_definitions.id 
     GROUP BY name_without_variants, id 
    ) AS combined_search 
GROUP BY name_without_variants, id 
HAVING total_relevance > 0 
ORDER BY total_relevance DESC 
LIMIT 10; 

これは私が得た結果です。 IDが異なっていて、あなたはIDによってグループ化されている、あなたはそれぞれに複数の行を取得しているため2 Lost Soul [Site Doubler]

2623 Lost Soul [Deck Discard] 6.35151714086533 
1410 Lost Soul [Hand Discard] 6.29273346662521 
1495 Lost Soul [Discard Card] 5.93360201716423 
1442 Lost Soul [Demon Discard] 5.91308708190918 
1497 Lost Soul [Site Doubler] 5.05888686180115 
1498 Lost Soul [Site Doubler] 5.05888686180115 
2572 Lost Soul [Site Guard] 4.82421946525574 
2774 Lost Soul [Far Country] 3.39325473308563 
2891 Fortify Site [RoA2] 2.77084048986435 
1418 Lost Soul [Hopper] 2.63041100502014 

答えて

2

に注意してください、それはGROUP BYが何をするかです。あなたはトップレベルSELECT

にBY
SELECT name_without_variants, SUM(relevance) as total_relevance 

と外側のGROUPに変更する場合:

GROUP BY name_without_variants 

あなたは明確な名前を見ていないはずですが、もはやIDを持っています。

+0

また、group byステートメントから削除すると、集計関数をid列に追加する必要があります。最小/最大または類似のものが必要です。 –

0
GROUP BY name_without_variants, id 

あなたはname_without_variants、idによってグループ分けしています。 IDは二つのレコードに異なります

1497 Lost Soul [Site Doubler] 5.05888686180115 
1498 Lost Soul [Site Doubler] 5.05888686180115 

はあなたがIDをどのように管理するかを決定する必要があります。

idをgroup byから削除し、選択したID列nに集計関数を追加します。または、列をすべて一緒に削除します。

ここでは、単一のクエリに縮小された例を示します。私はあなたのスキーマやデータに関する完全な見解を持っておらず、これもテストされていないことをご理解ください。私もここでいくつかの仮定をしています。しかし、スキーマがリレーショナルであれば、これはあなたが探しているものを返すはずです。

SELECT cd.id, cd.name_without_variants, (((MATCH(cd.name_without_variants) AGAINST ('lost soul site discard')) * 0.40)+ 
            ((MATCH(cdi.special_ability_text) AGAINST ('lost soul site discard')) * 0.05)+ 
            ((MATCH(b.brigade_color) AGAINST ('lost soul site discard')) * 0.30)+ 
            ((MATCH(i.identifier) AGAINST ('lost soul site discard')) * 0.20)+ 
            ((MATCH(ce.effect) AGAINST ('lost soul site discard')) * 0.05) 
           ) as total_relevance 
FROM card_definitions cd 
LEFT OUTER JOIN card_def_identities cdi ON cd.id=cdi.card_def_sid 
LEFT OUTER JOIN brigades b ON cd.id=b.card_def_sid 
LEFT OUTER JOIN identifiers i ON i.id=cdi.identifier_sid 
LEFT OUTER JOIN card_def_effects cde ON cde.card_def_sid=cd.id 
LEFT OUTER JOIN card_effects ce ON ce.id=cde.effect_sid 
GROUP BY cd.id, cd.name_without_variants 
HAVING total_relevance > 0 
ORDER BY total_relevance DESC 
LIMIT 10; 
+0

ああ、私はグループを名前をグループ化すると思っていましたが、まだ重複があった場合は、それらをidでグループ化します。私はまだIDが必要です。私はIDの上にちょうど1を得ることができ、重複する名前がないことを確認することができますか? – LordZardeck

+0

idカラムでmin/maxを使用する必要があります。ただし、unionedのselect文の1つから任意のidを取得します。あまり意味がないので、トップレベルセレクトからIDを削除するのは賢明かもしれません。それ以外の場合は、UNION SELECTステートメントに静的な列を追加して、IDがどのステートメントから来たのかを知る必要があります。理にかなっている?私は必要に応じて答えを編集することができます。 –

+0

私はIDが必要です。それは私が実際に使う唯一のものです。あなたが気にしないなら、私は例を見ることができますか?私は分/最大については何も知らない – LordZardeck

関連する問題