【问题标题】:Find MIN value based on two columns in MySQL根据 MySQL 中的两列查找 MIN 值
【发布时间】:2015-03-24 17:06:41
【问题描述】:

我在 MySQL 中拥有运动表现。

结构:

id (PRIMARY KEY)    
athlete_id (FOREIGN KEY)    
perform     
category_id     
discipline_id

如果我想从这个表中选择最好的表现(每个运动员最多只能出现一次),我使用这个查询:

SELECT 
  * 
FROM
  performs NATURAL 
  JOIN athletes 
  JOIN 
    (SELECT 
      athlete_id,
      MIN(perform) AS perform,
      category_id,
      discipline_id 
    FROM
      zaznamy 
    WHERE discipline_id = 4 
      AND category_id = 3 
    GROUP BY athlete_id) rec 
    ON performs.athlete_id = rec.athlete_id 
    AND performs.perform = rec.perform 
    AND performs.category_id = rec.category_id 
    AND performs.discipline_id = rec.discipline_id 
ORDER BY performs.perform 
LIMIT 25 

我得到了正确的结果。但我想从一个学科和更多类别中选择最好的表现(例如男子与青少年等)。如何对两列使用子句 GROUP BY?

【问题讨论】:

    标签: mysql database group-by min


    【解决方案1】:

    也许我不明白,但您可以在 group by 中添加两列,如下例所示。只需在两列或多列之间添加 ,(逗号)即可。

    SELECT 
    * 
    FROM
      performs NATURAL 
      JOIN athletes 
      JOIN 
        (SELECT 
          athlete_id,
          MIN(perform) AS perform,
          category_id,
          discipline_id 
        FROM
          zaznamy 
        WHERE discipline_id = 4 
        GROUP BY athlete_id,category_id) rec 
        ON performs.athlete_id = rec.athlete_id 
        AND performs.perform = rec.perform 
        AND performs.category_id = rec.category_id 
        AND performs.discipline_id = rec.discipline_id 
    ORDER BY performs.perform 
    LIMIT 25 enter code here
    

    编辑 - 更新

    好的,现在我了解您的问题了。实际上,这很常见,您希望首先找到组的最大值,然后请求有关该值的其他信息。

    实现此目的的一种方法是使用如下嵌套查询

    SELECT ss.athlete_id,ss.perform,category_id
    FROM performs ss
    inner join
    (SELECT
        athlete_id, MIN(perform) AS perform
    FROM 
        performs
    WHERE
        discipline_id = 4 AND category_id IN (1,3,5,7,9) 
    GROUP BY
        athlete_id) tt
        on tt.athlete_id = ss.athlete_id and ss.perform = tt.perform
    

    结果就是你上面描述的那个。

    【讨论】:

    • 谢谢,我已经尝试过此更新,但您的查询为每位运动员从每个类别中选择了最佳表现。但是我想选择所有类别中表现最好的运动员(他的个人最好成绩)。
    • 对不起,我不明白你在做什么。如果您希望他的个人最好,那么您的查询是正确的。给定数据,您能否提供一个示例,说明您的输出应该是什么样子?
    • 还有一件事,请 :) 如果结果将是一名运动员两次(运动员在两个不同类别中有两次相同的表演),我如何编辑 SQL 查询以只进行一次表演?跨度>
    • 这个查询的编写方式,一个运动员只能出现一次(因为嵌套查询中的 group by 子句)。所以没有运动员可以出现两次。 :)
    • 很遗憾,请检查下面的结果。
    【解决方案2】:

    如果我使用这个查询:

    SELECT
        athlete_id, MIN(perform) AS perform, category_id 
    FROM 
        performs
    WHERE
        discipline_id = 4 AND category_id IN (1,3,5,7,9) 
    GROUP BY
        athlete_id, category_id
    

    我得到了这个结果:

    athlete_id perform category_id
    1          11,14      1
    1          11,54      3
    1          11,54      5
    1          10,71      7
    2          11,04      1
    2          11,24      3
    2          11,54      5
    2          12,14      7
    3          10,94      1
    4          10,94      1
    4          11,34      3
    

    但我需要这个结果:

    athlete_id perform category_id
    1          10,71      7
    2          11,04      1
    3          10,94      1
    4          10,94      1
    

    对于每个运动员_id 最好的一次表现类别_id。 此结果将与全表“执行”进行 JOIN。

    【讨论】:

      【解决方案3】:

      SQL:

      SELECT ss.athlete_id,ss.perform,category_id
      FROM performs ss
      INNER JOIN
      (SELECT
       athlete_id, MIN(perform) AS perform
      FROM 
       performs
      WHERE
       discipline_id = 4 AND category_id IN (1,3,5,7,9) 
      GROUP BY
       athlete_id) tt
      ON tt.athlete_id = ss.athlete_id and ss.perform = tt.perform
      

      结果:

      athlete_id    perform    category_id
      1             7,04       1
      2             7,14       1
      3             7,14       1
      4             7,24       1
      5             7,14       1
      6             7,24       1
      6             7,24       3
      7             7,02       1
      8             7,07       1
      9             7,34       1
      10            7,34       1
      11            7,18       1
      12            7,04       3
      13            7,44       1
      13            7,44       5
      14            7,44       1
      15            7,27       1
      

      我尝试过 DISTINCT 子句,但结果相同。

      【讨论】:

        猜你喜欢
        • 2020-07-18
        • 1970-01-01
        • 2017-02-27
        • 1970-01-01
        • 1970-01-01
        • 2014-11-09
        • 1970-01-01
        • 1970-01-01
        • 2023-01-26
        相关资源
        最近更新 更多