Mysql 选择具有最小值的多个列

Mysql 选择具有最小值的多个列,mysql,sql,Mysql,Sql,模式示例: id val1 val2 val3 val4 val5 mid 1 5 6 7 1 4 1 4 7 8 5 9 5 1 5 4 1 4 2 7 2 7 3 2 8 7 2 1 下面是我正在尝试的内容,但此查询仅返回包含所有值的1行: SELECT id, MIN(val1), MIN(val2), MIN(val3), MIN(val4), MIN

模式示例:

id val1 val2 val3 val4 val5 mid
1   5     6    7    1    4   1
4   7     8    5    9    5   1
5   4     1    4    2    7   2
7   3     2    8    7    2   1
下面是我正在尝试的内容,但此查询仅返回包含所有值的1行:

SELECT id, MIN(val1), MIN(val2), MIN(val3), MIN(val4), MIN(val5) FROM table WHERE mid=1 
我希望结果是(对于每个val列,选择id,min作为min(valx),其中mid=1):

注意:列的数量最多可以是50(valx,其中x是从1到50的数字)。

使用函数

select id, least(val1, val2, <etc>)
from myTable
where mid=1
选择id,最少(val1,val2,)
从myTable
其中mid=1

如果我正确理解了你的问题,我希望它能帮助你

 SELECT id, MIN(minimum) as minimum FROM (
 SELECT id, val1 As minimum FROM table where  mid=1
 UNION ALL
 SELECT id, val2 As minimum FROM table where  mid=1
 UNION ALL
 SELECT id, val3 As minimum FROM table where  mid=1
 union All
 SELECT id, val4 As minimum FROM table  where  mid=1
 union ALL
 SELECT id, val5 As minimum FROM table where  mid=1
 ) As minvalue
 GROUP BY id 
这只是一个令人讨厌的问题和情况,但我知道你想要什么。如果你改进你的叙述,你可能会得到比这个更好的答案

以下是我认为你想要的结果和叙述的意思

查找Mid=1的每列的最小值,然后查找与该最小值相关的ID。上述结果如下:

id  minimum
7   3
7   2
4   5
1   1
7   2

注意45对实际上有54,但5是Val3中的最小值,因为表示的4是mid=2。因此,值5的ID为4…

对于前面的答案,很抱歉,没有看到您的结果。
select id, val1 from table where val1=(select min(val1) from table where mid=1) and mid=1
union all
select id, val2 from table where val2=(select min(val2) from table where mid=1) and mid=1
union all
select id, val3 from table where val3=(select min(val3) from table where mid=1) and mid=1
union all
select id, val4 from table where val4=(select min(val4) from table where mid=1) and mid=1
union all
select id, val5 from table where val5=(select min(val5) from table where mid=1) and mid=1
我希望这会给你结果

;with cte as(
    Select a.ID
        , t.Val
        , ROW_NUMBER() over(partition by a.id order by t.ColNo) as ColNo
    From @TABLE as a
    Outer apply (Values (1,Val1), (2,Val2),(3,Val3),(4,Val4), (5,Val5) ) t(ColNo,Val)
    Where a.MID=1
)
, cte2 as( 
    Select ColNo, MIN(val) as MinVal 
    From cte
    Group by ColNo
) 
    Select a.ID, a.Val from cte as a
    Inner join cte2 as b on a.ColNo=b.ColNo and a.Val=b.MinVal
    Order by a.ColNo

50列对我来说听起来像是糟糕的表格设计。聚合函数(如
MIN
)旨在对记录而不是列进行操作。您需要在语句末尾添加GROUP BY id。不清楚。您如何获得期望的结果?您使用mid的目的是什么?我想我明白你想做什么,但是在你想要的输出中,你产生了(5,1)和(5,4),但是mid=2不是1?@FrumRoll是的,你是对的,我修正了它。谢谢,这不是我想要的。它给我的行的最小值仅来自val1。这不是我想要的工作方式。它只从val1中提供最小值的行。我正在寻找一个查询,该查询为列表中不是最小值的val1、val2、val3、val4、val5提供了5行最小值(val1、val2、val3、val4、val5)。您的查询为我提供了所有列的行。谢谢。此代码只是一个简单的选择/分组依据。发帖后,发现这不是提问者想要的。我发布了另一个,它回答了这个问题,但是针对SQL-Server。您的查询只给出了1行最小值1。我尝试了SQLFIDLE,它给出了准确的所需输出可能是我的数据库问题或我用于val列的浮点系统问题。编辑:我的数据库可能有问题,你的分组排除了(7,3)和重复的(7,2)。我认为MySQL没有
OUTER APPLY
@Barmar是正确的。无法识别的关键字。(位置65的“外部”附近)您的查询按照我的要求运行!但是太大了一点。无论如何,谢谢你。
id  minimum
7   3
7   2
4   5
1   1
7   2
select id, val1 from table where val1=(select min(val1) from table where mid=1) and mid=1
union all
select id, val2 from table where val2=(select min(val2) from table where mid=1) and mid=1
union all
select id, val3 from table where val3=(select min(val3) from table where mid=1) and mid=1
union all
select id, val4 from table where val4=(select min(val4) from table where mid=1) and mid=1
union all
select id, val5 from table where val5=(select min(val5) from table where mid=1) and mid=1
;with cte as(
    Select a.ID
        , t.Val
        , ROW_NUMBER() over(partition by a.id order by t.ColNo) as ColNo
    From @TABLE as a
    Outer apply (Values (1,Val1), (2,Val2),(3,Val3),(4,Val4), (5,Val5) ) t(ColNo,Val)
    Where a.MID=1
)
, cte2 as( 
    Select ColNo, MIN(val) as MinVal 
    From cte
    Group by ColNo
) 
    Select a.ID, a.Val from cte as a
    Inner join cte2 as b on a.ColNo=b.ColNo and a.Val=b.MinVal
    Order by a.ColNo