【问题标题】:MySQL select all subquery rows with minimum valueMySQL选择具有最小值的所有子查询行
【发布时间】:2016-01-21 01:19:29
【问题描述】:

我想选择给定字段中具有最小值的子查询的所有行。以下是我迄今为止尝试过的一些技术示例:

-- 1.
select
    id, min(foo)
from
    (select 1 AS id, 2 AS foo
    union select 2 AS id, 2 AS foo
    union select 3 AS id, 3 AS foo) a;

-- 2.
select
    min(foo)
from
    (     
          select 1 AS id, 2 AS foo, 0 AS const
    union select 2 AS id, 2 AS foo, 0 AS const
    union select 3 AS id, 3 AS foo, 0 AS const) a
group by const;

-- 3.
select
    id
from
    (select 1 AS id, 2 AS foo
    union select 2 AS id, 2 AS foo
    union select 3 AS id, 3 AS foo) a
where id = (select id from a where min(foo) = foo);

-- 4.
select
    id
from
    (select 1 AS id, 2 AS foo
    union select 2 AS id, 2 AS foo
    union select 3 AS id, 3 AS foo) a
where foo = (select min(foo));

-- 5.
select r.*
from
(
    select min(foo) t
    from
        (select 1 AS id, 2 AS foo
        union select 2 AS id, 2 AS foo
        union select 3 AS id, 3 AS foo) a
) m
INNER JOIN a ON m.t = r.foo;

我正在处理的实际查询与示例类似,因为它由几个较小的查询联合在一起组成。这里的总体目标是根据关联表 k 的字段在 central 表中查找一行,其中 k 是最高优先级表。结果是来自相似(但不同表)的行的一种树状视图。

我已经提到了这一点,以防万一有人看到我正在绕道而行,他们可以对大局有所了解。但现在我的角度是通过在子查询中的字段上取最小值来选择。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    使用order bylimit

    select t.*
    from t
    order by foo
    limit 1;
    

    注意:即使有重复,这也只会返回具有最小值的一行。 t 是您的子查询或表。

    如果你想要所有这些,那么你需要包含两次表定义:

    select t.*
    from t
    where t.foo = (select min(t2.foo) from t t2);
    

    【讨论】:

    • “你需要包含表定义两次”——这就是我害怕的。我的子查询是野兽。
    • @JeffCarpenter。 . .第一种方法没有这个限制。如果您需要重复,那么视图是另一种可能性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多