首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sql查询未正确分组

sql查询未正确分组
EN

Stack Overflow用户
提问于 2012-04-05 01:15:32
回答 2查看 970关注 0票数 2

由于某些原因,下面的查询允许重复名称。为什么会这样呢?

代码语言:javascript
复制
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;

这是我得到的结果。请注意这两个Lost Soul [Site Doubler]

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2012-04-05 01:18:27

因为ID是不同的,并且您是按ID分组的,所以每个ID都有多行,这就是GROUP BY所做的。如果您将顶级SELECT更改为

代码语言:javascript
复制
SELECT name_without_variants, SUM(relevance) as total_relevance

最外层的GROUP BY:

代码语言:javascript
复制
GROUP BY name_without_variants

您应该会看到不同的名称,但将不再具有该id。

票数 2
EN

Stack Overflow用户

发布于 2012-04-05 01:23:27

代码语言:javascript
复制
GROUP BY name_without_variants, id

您正在按name_without_variants,id进行分组。这两个记录的id不同:

代码语言:javascript
复制
1497    Lost Soul [Site Doubler]    5.05888686180115
1498    Lost Soul [Site Doubler]    5.05888686180115

您需要决定如何管理id。

从group by中删除id,并将聚合函数添加到select中的id列。或者只是将该列全部删除。

下面是一个简化为单查询的示例。请理解,我对您的模式或数据没有完整的透视图,也没有经过测试。我在这里也做了一些假设。但是,如果模式是关系模式,这应该会返回您正在寻找的内容:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10016111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档