Mysql 返回具有最接近值的列名
因此,我不知道这是否可行,但我想将具有壁橱值的列的名称返回到我的查询中 这是我的桌子:Mysql 返回具有最接近值的列名,mysql,sql,sqlite,Mysql,Sql,Sqlite,因此,我不知道这是否可行,但我想将具有壁橱值的列的名称返回到我的查询中 这是我的桌子: -------------------------- | ID | D1 | D2 | D3 | D4 | -------------------------- | 1 | 0 | 10 | 22 | 50 | -------------------------- 我想做一个查询,在D1到D4中搜索最接近的值20,在本例中是D3 然后我想返回D3和其中的值 因此,我的答案应该是: ------ | D3
--------------------------
| ID | D1 | D2 | D3 | D4 |
--------------------------
| 1 | 0 | 10 | 22 | 50 |
--------------------------
我想做一个查询,在D1到D4中搜索最接近的值20,在本例中是D3
然后我想返回D3和其中的值
因此,我的答案应该是:
------
| D3 |
------
| 22 |
------
这是不是有可能 不容易。因为在同一条记录中,这些字段是不同的,所以必须使用非常难看的查询:
SELECT source, val, ABS(20 - val) AS diff
FROM (
SELECT 'd1' AS source, d1 AS val FROM foo
UNION ALL
SELECT 'd2', d2 FROM foo
UNION ALL
SELECT 'd3', d3 FROM foo
UNION ALL
SELECT 'd4', d4 FROM foo
) AS child
ORDER BY diff DESC
LIMIT 1
您应该创建您的表,这将完全消除整个
联合
业务,只留下外部父查询。不容易。因为在同一条记录中,这些字段是不同的,所以必须使用非常难看的查询:
SELECT source, val, ABS(20 - val) AS diff
FROM (
SELECT 'd1' AS source, d1 AS val FROM foo
UNION ALL
SELECT 'd2', d2 FROM foo
UNION ALL
SELECT 'd3', d3 FROM foo
UNION ALL
SELECT 'd4', d4 FROM foo
) AS child
ORDER BY diff DESC
LIMIT 1
您应该创建一个表,它将完全消除整个
联合业务,只保留外部父查询
您使用什么语言来回显数据?看看类似的内容
您使用什么语言来回显数据?您可以使用复杂的案例来执行此操作:
select (case least(abs(d1 - 20), abs(d2 - 20), abs(d3 - 20), abs(d4 - 20))
when abs(d1 - 20) then 'd1'
when abs(d2 - 20) then 'd2'
when abs(d3 - 20) then 'd3'
when abs(d4 - 20) then 'd4'
end)
from mytable;
注意:这应该比使用union-all
规范化数据具有更好的性能。但是,作为对数据结构的注释,您可能希望将值存储在单独的行中,而不是单独的列中。具有基本相同值的独立列通常意味着需要一个连接表。您可以使用复杂的案例来实现这一点:
select (case least(abs(d1 - 20), abs(d2 - 20), abs(d3 - 20), abs(d4 - 20))
when abs(d1 - 20) then 'd1'
when abs(d2 - 20) then 'd2'
when abs(d3 - 20) then 'd3'
when abs(d4 - 20) then 'd4'
end)
from mytable;
注意:这应该比使用union-all
规范化数据具有更好的性能。但是,作为对数据结构的注释,您可能希望将值存储在单独的行中,而不是单独的列中。具有基本相同值的独立列通常意味着需要一个连接表。您可以更改表的设计吗?它不是标准化的如果多个值最接近怎么办?无法更改表格,这是我必须处理的:(如果有几个值最接近,那么它们中最小的;)您可以更改表格设计吗?它不是标准化的如果多个值最接近怎么办?无法更改表格,这就是我必须处理的:(如果几个值最接近,那么它们中最小的;)为什么会得到负号?因为这不是答案。这是“到这里来看看答案”。仅链接的答案不是答案。e、 如果这个链接消失了,那么你的答案就没用了。答案应该是答案,而不是问题。要要求澄清,请使用注释。为什么会得到负号?因为这不是答案。这是“到这里来看看答案”。仅链接的答案不是答案。e、 如果这个链接消失了,那么你的答案就没用了。答案应该是答案,而不是问题。若要澄清,请使用评论。SQLlite似乎不知道“最少”@BonifatiusK。这个问题被标记为“mysql”(也是)。我知道,答案是正确的,但不是针对sqllite。下次我会更清楚的。谢谢你的帮助!看来SQLlite不知道“最少”@BonifatiusK。这个问题被标记为“mysql”(也是)。我知道,答案是正确的,但不是针对sqllite。下次我会更清楚的。谢谢你的帮助!无法规范化该表。这看起来是最接近这里的。此时,我得到一个“syntact error,near select”,但它没有显示错误。无法规范化表。这看起来是最接近这里的。在这一点上,我得到了一个“syntact error,near select”,但它没有显示错误。