Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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 SQL-查找与给定参数最接近的价格_Mysql_Sql_Database_Db2 - Fatal编程技术网

Mysql SQL-查找与给定参数最接近的价格

Mysql SQL-查找与给定参数最接近的价格,mysql,sql,database,db2,Mysql,Sql,Database,Db2,我试图找到最接近SQL中给定参数的价格元组。 例如:参数price=6将返回id 1和2。 参数price=20将返回id 3 表: ID PRICE 1 5 2 5 3 10 SELECT id FROM Table WHERE table.price ?? 6 有什么办法吗 多谢各位 SELECT ID FROM TableX WHERE PRICE = @CheckPrice + ( SELECT MIN(ABS(PRICE - @C

我试图找到最接近SQL中给定参数的价格元组。 例如:参数price=6将返回id 1和2。 参数price=20将返回id 3

表:

ID     PRICE
1      5
2      5
3      10

SELECT id 
FROM Table
WHERE table.price ?? 6
有什么办法吗

多谢各位

SELECT ID
FROM TableX
WHERE PRICE = @CheckPrice +
      ( SELECT MIN(ABS(PRICE - @CheckPrice))
        FROM TableX
      )
   OR PRICE = @CheckPrice -
      ( SELECT MIN(ABS(PRICE - @CheckPrice))
        FROM TableX
      )
或者性能可能更好:

SELECT ID
FROM 
    TableX
  CROSS JOIN
          ( SELECT 
                ( SELECT MIN(PRICE) - @CheckPrice
                  FROM TableX
                  WHERE PRICE >= @CheckPrice
                ) AS Pover 
              , ( SELECT @CheckPrice - MAX(PRICE)
                  FROM TableX
                  WHERE PRICE <= @CheckPrice
                ) AS Punder
            FROM dual
          ) AS tmp 
WHERE PRICE IN ( @CheckPrice + LEAST(Pover, Punder)
               , @CheckPrice - LEAST(Pover, Punder)
               )
或者性能可能更好:

SELECT ID
FROM 
    TableX
  CROSS JOIN
          ( SELECT 
                ( SELECT MIN(PRICE) - @CheckPrice
                  FROM TableX
                  WHERE PRICE >= @CheckPrice
                ) AS Pover 
              , ( SELECT @CheckPrice - MAX(PRICE)
                  FROM TableX
                  WHERE PRICE <= @CheckPrice
                ) AS Punder
            FROM dual
          ) AS tmp 
WHERE PRICE IN ( @CheckPrice + LEAST(Pover, Punder)
               , @CheckPrice - LEAST(Pover, Punder)
               )

此查询使用子查询选择最接近的价格,然后返回与该价格匹配的所有行:

SELECT *
FROM Table
WHERE price = ( --could also use "WHERE price in" here...
    SELECT TOP 1 price FROM Table
    GROUP BY price
    ORDER BY Min(Abs(price - ?)))

此查询使用子查询选择最接近的价格,然后返回与该价格匹配的所有行:

SELECT *
FROM Table
WHERE price = ( --could also use "WHERE price in" here...
    SELECT TOP 1 price FROM Table
    GROUP BY price
    ORDER BY Min(Abs(price - ?)))

我们使用UNION子查询来获取目标价格的最接近价格。 在每个子查询中,我们得到每个模型价格和目标价格之间的绝对差值,最后按差值排序。工作非常快速和稳定。希望有帮助

SET @CheckPrice = 3910;

(
    SELECT
        m_id,
        m_name,
        m_auto_price,
        m_auto_discount,
        ABS(m_auto_price - @CheckPrice)AS delta
    FROM
        s_models
    WHERE
        m_auto_price >= @CheckPrice
    ORDER BY
        m_auto_price ASC
    LIMIT 10
)
UNION
    (
        SELECT
            m_id,
            m_name,
            m_auto_price,
            m_auto_discount,
            ABS(m_auto_price - @CheckPrice)AS delta
        FROM
            s_models
        WHERE
            m_auto_price <= @CheckPrice
        ORDER BY
            m_auto_price DESC
        LIMIT 10
    )
ORDER BY
    delta ASC,
    m_auto_price DESC,
    m_auto_discount DESC

我们使用UNION子查询来获取目标价格的最接近价格。 在每个子查询中,我们得到每个模型价格和目标价格之间的绝对差值,最后按差值排序。工作非常快速和稳定。希望有帮助

SET @CheckPrice = 3910;

(
    SELECT
        m_id,
        m_name,
        m_auto_price,
        m_auto_discount,
        ABS(m_auto_price - @CheckPrice)AS delta
    FROM
        s_models
    WHERE
        m_auto_price >= @CheckPrice
    ORDER BY
        m_auto_price ASC
    LIMIT 10
)
UNION
    (
        SELECT
            m_id,
            m_name,
            m_auto_price,
            m_auto_discount,
            ABS(m_auto_price - @CheckPrice)AS delta
        FROM
            s_models
        WHERE
            m_auto_price <= @CheckPrice
        ORDER BY
            m_auto_price DESC
        LIMIT 10
    )
ORDER BY
    delta ASC,
    m_auto_price DESC,
    m_auto_discount DESC

非常感谢。我已经很久没有用过Sql了,谢谢。自从我使用sqlThis已经有很长一段时间了。只有当MinAbprice-@CheckPrice恰好与数据库中已有的价格匹配时,它才会返回行。在问题中的示例中,MinAbsprice-6的计算结果为1,它不会出现在价格列中,因此不会返回任何行。只有当MinAbsprice-@CheckPrice恰好与数据库中已有的价格完全匹配时,才会返回行。在问题中的示例中,MinAbsprice-6的计算结果为1,它不会出现在price列中,因此不会返回任何rows.Nice。但是,如果价格为5,5,7,并且您检查了6,结果将是价格为5的ID或价格为7的ID或多或少随机。我同意它排除了价格等距的情况,但它将始终返回更高的价格,因为ORDER BY-而不是像您建议的那样随机。ORDER BY是在ABS调用之后完成的,因此,我坚持认为,前1名将是一个相当随机的选择。@ypercube OK,我确实明白您的推理,但我只是在SqlServer中设置了它,而不是在MySql中,并且无论将记录插入到表中的顺序如何,或者有多少记录在参数上/下,都会得到相同的一致结果。我猜这和默认的排序顺序有关?可能吧。我现在也不能办理登机手续。很好。但是,如果价格为5,5,7,并且您检查了6,结果将是价格为5的ID或价格为7的ID或多或少随机。我同意它排除了价格等距的情况,但它将始终返回更高的价格,因为ORDER BY-而不是像您建议的那样随机。ORDER BY是在ABS调用之后完成的,因此,我坚持认为,前1名将是一个相当随机的选择。@ypercube OK,我确实明白您的推理,但我只是在SqlServer中设置了它,而不是在MySql中,并且无论将记录插入到表中的顺序如何,或者有多少记录在参数上/下,都会得到相同的一致结果。我猜这和默认的排序顺序有关?可能吧。我现在也不能办理登机手续。