如何获取值列表中值最小的行

时间:2018-10-17 11:51:19

标签: mysql sql database group-by

我有一个这样的数据集:

id       item         value
1         B             6
2         B             1
3         A             1
4         C             3
5         D             6
6         D             9

我需要获取具有特定值的项目,只有一次具有最小值,并按项目排序。 因此,如果我只需要值为1,6或3的商品,我想作为回应:

id       item         value
    3         A             1
    2         B             1
    4         C             3
    5         D             6

我尝试使用group by并按值排序,但是看来group占据了第一行:

SELECT * FROM tbl1 WHERE value IN (1,3,6) GROUP BY item ORDER BY item, value

代替获取行-

 2         B          1

我知道了-

 1         B          6

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

请勿使用group by过滤数据。这就是where的目的。在这种情况下,请使用相关子查询:

SELECT t1.*
FROM tbl1 t1
WHERE t1.value IN (1, 3, 6) AND
      t1.value = (SELECT MIN(tt1.value) FROM tbl1 tt1 WHERE tt1.item = t1.item AND tt1.value IN (1, 3, 6));

使用合理的索引,上述操作应该足够快。请注意,不需要在外部查询中对value进行过滤。

出于性能考虑,我将其表达为:

SELECT t1.*
FROM tbl1 t1
WHERE t1.id = (SELECT tt1.id
               FROM tbl1 tt1
               WHERE tt1.item = t1.item AND
                     tt1.value IN (1, 3, 6)
               ORDER BY tt1.value 
               LIMIT 1
              );

此查询假定tbl1(id)是主键(似乎是一个合理的假设)。然后,您想要在tbl1(tt1, item, value, id)上建立索引。

答案 1 :(得分:0)

使用相关子查询

select t.* from your_table t where t.value =
( select min(value) from your_table t1 where t1.item=t.item
  and t1.value in (1,3,6)
) and t.value in (1,3,6)

答案 2 :(得分:0)

这将起作用: 输入:

  select max(id),item,min(value) from tbl1 where value in(1,3,6) group by 
  item ;

输出:

max(id) item    min(value)
3   A   1
2   B   1
4   C   3
5   D   6