如何根据一行中的数字序列获取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”开头的文件中的第一行。后跟除数字以外的任何字符?

如何在该行某处某处的某一行中的特定字符串之后从文本文件中获取一个数字?

如何在 C++ 中的同一行中获取多个输入?

如何从logstash中的日志消息中获取数字?

如何根据 Python 中的索引时间序列条件将新数据集附加到现有数据集