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

rwqw0loc  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(273)

我有这样一个数据集:

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和ordering by the value,但似乎该组使用了第一行:

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

而不是吵架-

2         B          1

我明白了-

1         B          6

有什么想法吗?

8xiog9wr

8xiog9wr1#

这将起作用:输入:

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
cetgtptt

cetgtptt2#

使用相关子查询

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)
xesrikrc

xesrikrc3#

不要使用 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) .

相关问题