mysql - sql查询没有正确分组

标签 mysql group-by

出于某种原因,下面的查询允许重复名称。这是为什么?

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]

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

最佳答案

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

SELECT name_without_variants, SUM(relevance) as total_relevance

和外部 GROUP BY 到:

GROUP BY name_without_variants

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

关于mysql - sql查询没有正确分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10016111/

相关文章:

java - 如何在 Spring JPA for MySQL 中为 @Id @GeneratedValue 设置初始值?

php - Laravel 4如何将表单数据提交到不同的表

mysql - 我应该如何索引这个 MySQL 数据库?

在 Ajax 重环境中存储在 MySQL 中的 PHP Session

php - MySQL 按天分组,带有 TIMESTAMP 列

mysql - 自动增加空字段,保留非空字段

php - Yii:如何使用 CDbCriteria 在 GROUP BY 之前进行 ORDER BY?

mysql - 从每个团队中获取最多 2 个用户,结果最好 MYSQL

mysql - 如何正确获取图表值统计

MySQL:过滤组 View 与内联选择