MySQL Query用于检索特定条件中的最大值

时间:2014-04-09 05:36:00

标签: mysql aggregate-functions

我的产品排名不同。产品可能是超级组的成员(如Cream)。

product_id | supergroup | rank | other_info

1          | Cream      | 3    | Eric
2          | Zep        | 1    | Jimmy
3          | Zep        | 4    | Jon Paul
4          | Cream      | 3    | Jack
5          | Cream      | 4    | Ginger
6          | Who        | 4    | Roger
7          | Who        | 5    | John
8          | Who        | 3    | Pete

我希望获得每个组的最高产品排名,以及该产品ID的其他信息。排名不适用于组内排名。它们是适用于系统中所有产品的排名。因此,即使在同一组中,不止一种产品可能具有相同的等级。

编辑:修复" other_info"。我在那里有些胡言乱语。还添加了一行。结果应该从最高级别到最低级别。但是,它们也应仅包含每个product_id中排名最高的supergroup,以及匹配的other_info

product_id | supergroup | rank | other_info
2          | Zep        | 1    | Jimmy
8          | Who        | 3    | Pete
1          | Cream      | 3    | Eric

我可以通过简单的查询来做到这一点吗?现有系统的查询已经涉及超组上的GROUP BY语句,而SELECT中没有聚合器。这导致组内的随机但连贯的行。修改查询以获得完整行的最简单方法是什么,但始终是每个超级组中排名最高的成员。

如果没有办法,那么:没有GROUP BY,这可能吗?

1 个答案:

答案 0 :(得分:1)

SELECT t.*
FROM your_table t
JOIN (
    SELECT MIN(product_id) as product_id #if there are multiple products with the same (min) rank in the same supergroup - get the one with lowest product_id
    FROM your_table tt
    JOIN (
        SELECT supergroup, MIN(rank) as min_rank
        FROM your_table
        GROUP BY supergroup
    ) mr ON mr.supergroup = tt.supergroup AND mr.min_rank = tt.rank
    GROUP BY tt.supergroup, tt.rank
) as mid ON mid.id.product_id = t.product_id
ORDER BY whatever_you_need_to

您需要(supergroup,rank)上的索引才能有效运行。