Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 返回具有最接近值的列名_Mysql_Sql_Sqlite - Fatal编程技术网

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”,但它没有显示错误。