【问题标题】:How to get lowest value from posts with the same ID [duplicate]如何从具有相同 ID 的帖子中获得最低价值 [重复]
【发布时间】:2020-10-01 13:39:12
【问题描述】:

我的示例表:

ID | Post_id | Score
1  | 1       | 33
2  | 1       | 43
3  | 1       | 27
4  | 1       | 66

我想获得具有最低值(分数)的行。在这种情况下是:

ID | Post_id | Score
3  | 1       | 27

我的查询:

SELECT * FROM table WHERE post_id = '1' GROUP BY post_id ORDER BY Score ASC

但这不起作用,因为它返回我:分数:33

如何解决?如果我有数千行并且希望 post_id 对于最低值是唯一的怎么办?

【问题讨论】:

  • 如果有两行(或多行)具有相同的最低值,预期的结果是什么?
  • 只获取第一行
  • 你使用的是什么版本的 MySQl?

标签: mysql sql greatest-n-per-group


【解决方案1】:

您必须使用子查询为每个 post_id 选择最小值。

SELECT a.* FROM records a
JOIN 
( SELECT post_id, MIN(score) as min_score
  FROM records  GROUP BY post_id
) b
ON a.score=b.min_score;

输出

| id  | post_id | score |
| --- | ------- | ----- |
| 3   | 1       | 27    |
| 5   | 2       | 20    |

View on DB Fiddle

【讨论】:

    【解决方案2】:

    对于单个id,只需删除group by 并使用limit

    SELECT *
    FROM table
    WHERE post_id = 1
    ORDER BY Score ASC
    LIMIT 1;
    

    我假设post_id 是一个数字。将数字与数字进行比较,而不是与字符串进行比较。

    编辑:

    如果你想要这个 per post_id,那么只需使用相关子查询:

    select t.*
    from t
    where t.score = (select min(t2.score) from t t2 where t2.post_id = t.post_id);
    

    【讨论】:

    • 如果我有数千行并且希望 post_id 对于最低值是唯一的怎么办?
    • @TomHarisond 。 . .那么你会有一个不同的问题。你应该清楚你提出的问题。本网站的目的不是“猜我的问题”。目的是回答结构良好的问题。您在这里的问题显然是由post_id 过滤的。
    【解决方案3】:

    如果您可能有多行得分最低,您可以使用子查询来做到这一点:

    SELECT *
    FROM test
    WHERE post_id = 1
    AND score = (
      SELECT MIN(score)
      FROM test 
      WHERE post_id = 1
    )
    

    小提琴:https://www.db-fiddle.com/f/3ppntnA77HFpKRU82h32Gv/1

    【讨论】:

      【解决方案4】:

      如果您使用的是 MySQL v8.0,则可以使用 ROW_NUMBER() 函数对结果进行排序。这样您就可以选择得分较低的行并从中返回所有内容:

      select
          sq.id, sq.post_id, sq.score
      from
          (select id, post_id, score
              , row_number() over (partition by post_id order by score) RowNo 
          from test) sq
      where sq.RowNo = 1
      

      这是一个 Fiddle 来测试代码:https://www.db-fiddle.com/#&togetherjs=8dHSCs50Iq

      我还在您的示例数据旁边添加了另一个 post_id,以演示它如何对多个 post_id 做出反应

      【讨论】:

      • 我使用的是 Mysql 5.7。
      • 不幸的是,v5.7 不支持ROW_NUMBER()。我会建议 Tajni 的解决方案,因为它是最透明的
      【解决方案5】:

      下面应该可以解决问题:

      Select
          id, 
          score, 
          Post_id,
          min(score)
      from 
          table
      where 
          score = min(score);
      

      【讨论】:

      • 这似乎不是一个有效的查询,因为它缺少 GROUP BY 子句
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 2021-01-07
      • 1970-01-01
      • 2018-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多