我有一个这样的数据集:
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
有什么想法吗?
答案 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