【问题标题】:Select min value per item in MySQL在 MySQL 中选择每个项目的最小值
【发布时间】:2015-08-18 09:17:48
【问题描述】:

您好,我有以下 MySQL 表:

id       item         value
1         A             11
2         A             20
3         B              2
4         C              1
5         B             14
6         C             12

我正在尝试做的是选择具有最低值的项目 - 我尝试根据搜索此论坛做的是使用以下查询:

  SELECT *,
         MIN(value) 
    FROM mytable 
GROUP BY item

预期的结果应该是A => 11, B => 2; C => 1 但是对于某些项目,最小值是正确的,而对于其他一些项目,最小值是不同的值。请注意,mytable 包含大约 100 行。

【问题讨论】:

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


【解决方案1】:

你可以试试这个方法。

SELECT t.* FROM mytable  t
JOIN 
( SELECT item, MIN(value) minVal
  FROM mytable  GROUP BY item
) t2
ON t.value = t2.minVal AND t.item = t2.item;

【讨论】:

    【解决方案2】:

    这将在 oracle 中工作

    SELECT item, min(value)
    FROM mytable
    GROUP BY item
    

    【讨论】:

    • 好的,但是当我在其中添加 id 时; id 不对应于具有最低项目 + 值的行的 id ...该值是 INT 但对于多个项目可以是相同的。我们能否以某种方式改进这一点以获取项目可见的最低值的 id?
    【解决方案3】:
    select *
    from mytable t1
    inner join
    (
      select min(value) value, id
      from mytable 
      group by id
    ) t2
      on t1.id = t2.id
      and t1.value= t2.value
    

    【讨论】:

    • 您不太可能想要返回所有列。
    【解决方案4】:

    如果您需要每个项目的 min(value) 的所有信息,并且“value”列的数据类型是 int,则运行以下查询,

    select * from mytable
    where (item,value) in
    (
       SELECT item, min(value)
       FROM mytable
       GROUP BY item
    )
    

    请看SQL fiddle

    【讨论】:

    • 请注意,这使用了依赖子查询,这意味着性能可能很差。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    相关资源
    最近更新 更多