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

Mysql 选择条目按最低秒\字段过滤具有相同字段的行,mysql,sql,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 我想选择

我有一张像这样的桌子:

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
我想选择所有具有不同标志的行,在每组标志上选择最低价格 在这个例子中,我得到:

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

1          0            50
2                       400
3          4            200
5          3            100
7          2            120
请注意,该标志不是强制性的,因此它可以有一个int值或nothing null值

问候

编辑:

我只是想说清楚

我想选择所有具有id和价格的行,所有行都不按价格过滤。 然后我只想加入每组旗帜中价格最低的一行

这里有一个答案


下面的查询找到每个标志的最低价格,然后将它们与原始数据合并,以获取该行的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)

下面的查询查找每个标志的最小价格,然后将它们与原始数据关联,以获取该行的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)

我想你需要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
如果你需要它,你必须这样做

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

最后一个查询使用分组的结果,再次与原始表连接,然后过滤价格与最小值不同的行,我认为您需要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
如果你需要它,你必须这样做

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


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

这是错误的,tsum将始终只有一行,您需要使用group by。@João。非常感谢。我对其进行了编辑,以使查询符合我所描述的内容。当然,没问题,MySQL在这种情况下会抛出一个错误,就像Oracle在其非单一组函数消息中所做的那样。@João。MySQL在这种情况下绝对不会抛出错误。事实上,文档将其描述为一种功能,称为隐藏列。正如我之前所说,MySQL afficionados会捍卫或类似于此。我们中的其他人只是挠头想知道为什么SQL引擎会接受坏掉的SQL。事实上,他们所谓的隐藏列,大多数人都称之为非标准SQL-这是错误的,tsum将始终只有一行,您需要使用group by。@João。非常感谢。我对其进行了编辑,以使查询符合我所描述的内容。当然,没问题,MySQL在这种情况下会抛出一个错误,就像Oracle在其非单一组函数消息中所做的那样。@João。MySQL在这种情况下绝对不会抛出错误。事实上,文档将其描述为一种功能,称为隐藏列。正如我之前所说,MySQL afficionados会捍卫或类似于此。我们中的其他人只是挠头想知道为什么SQL引擎会接受坏掉的SQL。事实上,他们所谓的隐藏列,大多数人都称之为非标准SQL-这在sqlfiddle数据中可以正常工作,但在视图中不能正常工作。这可能是因为它是一个视图吗?不,不管它是一个表还是一个视图。当你说它不能正常工作时,你到底是什么意思?它给你的结果不正确?它返回了多个相同编号的标志,因此不是最低价格。有什么问题吗?好吧,我以为你想要两行。为了反映这一点,我修改了我的答案,现在它可以很好地处理新的数据集。您可以为此创建SQLFIDLE吗?最终结果中只有一行没有标记?标准是什么?价格最低的那个?检查这个sqlfiddle。它可以正确处理sqlfiddle数据,但是它不能正确处理视图。这可能是因为它是一个视图吗?不,不管它是一个表还是一个视图。当你说它不能正常工作时,你到底是什么意思?它给你的结果不正确?它返回了多个相同编号的标志,因此不是最低价格。有什么问题吗?好吧,我以为你想要两行。为了反映这一点,我修改了我的答案,现在它可以很好地处理新的数据集。您可以为此创建SQLFIDLE吗?最终结果中只有一行没有标记?标准是什么?价格最低的那个?检查这把小提琴。