选择条目按最低second_field过滤具有相同字段的行

时间:2012-08-16 14:33:24

标签: mysql sql

我有一张表:

id(int)    flag(int)    price(float)

1          0            50
2                       400
3          4            200
4          3            150
5          3            100
6          3            400
7          2            120

我想选择具有不同flag的所有行,在每个price组中选择最低flag 所以,在这个例子中,我得到:

id(int)    flag(int)    price(float)

1          0            50
2                       400
3          4            200
5          3            100
7          2            120

请注意,flag不是必需的,因此它可以有值(int)或没有(null)。

此致

编辑:

只是为了清楚。

我想选择所有包含idprice的行,而不是按价格过滤。 那么我只想加入flags

每组中价格最低的一行

3 个答案:

答案 0 :(得分:3)

SELECT id, flag, price
FROM tbl t
WHERE NOT EXISTS (
  SELECT 1
  FROM tbl tt
  WHERE t.flag = tt.flag
    AND (tt.price < t.price 
         OR (tt.price = t.price AND t.id < tt.id)));

这是一个sqlfiddle

答案 1 :(得分:2)

以下查询查找每个标志的最低价格,然后将它们连接到原始数据以获取ID(以及该行的其他信息)。

select t.*
from table t join
     (select flag, min(price) as minprice
      from table t
      group by flag
     ) tsum
     on (tsum.flag = t.flag or tsum.flag is null as t.flag is null) and
        (tsum.minprice = t.price)

答案 2 :(得分:0)

我认为你需要Id列,如果不是你只需要这样做

SELECT flag, MIN(price) as price FROM Table GROUP BY flag

如果你需要它,你必须这样做

SELECT TBL1.*
FROM table TBL1
LEFT JOIN (SELECT flag, MIN(price) as price FROM table GROUP BY flag) TBL2
ON TBL1.flag = TBL2.flag AND TBL1.price = TBL2.price
WHERE TBL2.price IS NOT NULL

最后一个查询使用分组结果,再次与原始表连接,然后过滤价格与最小值不同的行