如何根据一行中的数字序列获取mysql-table列的最小值
Posted
技术标签:
【中文标题】如何根据一行中的数字序列获取mysql-table列的最小值【英文标题】:How to get the minimum value of a mysql-table column based on the number sequence in a row 【发布时间】:2020-11-02 16:32:21 【问题描述】:我有一个 mysql 表(结果),其中有六列,如下所示:
+----+-------+-------+-------+-------+-------+
| id | can_1 | can_2 | can_3 | can_4 | can_5 |
+----+-------+-------+-------+-------+-------+
| 1 | 1 | 0 | 2 | 4 | 3 |
+----+-------+-------+-------+-------+-------+
| 2 | 2 | 1 | 5 | 3 | 4 |
+----+-------+-------+-------+-------+-------+
| 3 | 3 | 1 | 0 | 0 | 0 |
+----+-------+-------+-------+-------+-------+
| 4 | 0 | 2 | 1 | 0 | 3 |
+----+-------+-------+-------+-------+-------+
我正在尝试根据每行中存储的值从 can_1 列中获取具有最小值大于 1 的行。
例如:can_1 需要返回第 2 行和第 3 行,因为 2 是第 2 行的最小值,3 是第 3 行的最小值。
使用
SELECT id FROM results WHERE can_1 = (SELECT MIN(can_1) FROM results);
返回
+----+
| id |
+----+
| 2 |
+----+
这是可以理解的 - MIN-value 检查整个列 (can_1) 中大于 1 的最小值,在 can_1 情况下为 2。但是我该如何组合它,以便 整个 行(覆盖所有列)的最小值决定了 can_1 列返回的最小值,即。结果会是这样吗?
+----+
| id |
+----+
| 2 |
+----+
| 3 |
+----+
【问题讨论】:
第 2 行的最小值是 2,第 3 行的最小值是 3?与其他列相比,它不是,与 can_1 的其他行值相比也不是。 正如我在问题中提到的,我正在寻找大于 1 的最小值(我什至将其设为粗体)。然后 2 是第 2 行的最小值和第 3 行的 3... “第 2 行的值”是什么意思?每行的每一列只有一个值(在本例中为 can_1)。第 2 行还有哪些其他值?因为第 2 行的 can_2 小于 can_1。 好的——我明白你的意思了。我需要澄清我的问题。不挂断。 :) 【参考方案1】:您可以使用函数LEAST()
:
select id
from tablename
where can_1 > 1
and can_1 = least(
can_1,
case when can_2 <= 1 then can_1 + 1 else can_2 end,
case when can_3 <= 1 then can_1 + 1 else can_3 end,
case when can_4 <= 1 then can_1 + 1 else can_4 end,
case when can_5 <= 1 then can_1 + 1 else can_5 end
)
请参阅demo。 结果:
| id |
| --- |
| 2 |
| 3 |
【讨论】:
只是另一种方式(也许不是那么高效):db-fiddle.com/f/aMuBs7o2kcQJCXPx4AGvtb/1 我认为它也适用于所有情况。 任何影响我学习 MySQL 基础知识的例子都是对我有利的。我非常感谢你向我展示这个。几个星期以来,我一直在为此苦苦挣扎,试图在不寻求帮助的情况下解决它。 我只有一个后续问题。此查询假设 3 必须是 2 之后最接近的“最小”值。但它也可能是 4 或 5,具体取决于行中零的数量,即。 1,0,0,0,5。那么 5 将是最小整数。 can_x + 1 在 2 (3) 之后处理以下整数,但由于序列是动态创建的,我从不知道最接近的最小值是多少。我将如何使用您的答案中给出的相同技术来解决这个问题? :) 你为什么用“最近”这个词?这里没有近似值。表达式can_1 + 1
用于确保如果一个数字can_1,原因是它必须从least() 中排除。
不,can_1 + 1 是表达式返回的内容。如果连续 can_1 为 3,则 can_1 + 1 为 4。以上是关于如何根据一行中的数字序列获取mysql-table列的最小值的主要内容,如果未能解决你的问题,请参考以下文章
如何仅获取以“1”开头的文件中的第一行。后跟除数字以外的任何字符?