MySQL中的整数除法

Posted

技术标签:

【中文标题】MySQL中的整数除法【英文标题】:Integer division in MySQL 【发布时间】:2012-07-01 01:46:47 【问题描述】:

我有一个 mysql 表,它有一个 product_id 字段(大整数)

1102330008 1102330025 1102330070 1103010009 1103010010 1103020006 ...

我想选择具有product_id = 110301**** 的行。我尝试使用此查询:

SELECT * FROM `product` WHERE (product_id/10000)=110301  

但它不返回任何值与此消息:

MySQL returned an empty result set (i.e. zero rows). ( Query took 0.0005 sec )

【问题讨论】:

你为什么用除法而不是BETWEEN< > 【参考方案1】:

使用DIV operator。

mysql> SELECT 5 DIV 2;
    -> 2

整数除法。类似于 FLOOR(),但使用 BIGINT 值是安全的。超出 BIGINT 范围的非整数操作数可能会出现不正确的结果。

【讨论】:

不像 FLOOR(),而是 TRUNCATE()。例如:select -5 div 2, floor(-5 / 2); 你会得到-2, -3【参考方案2】:
SELECT *
FROM product
WHERE product_id BETWEEN 1103010000
                     AND 1103019999  

如果你想在 php 中创建你的查询,那么你可以像这样构造你的查询

$sql = "
    SELECT *
    FROM product
    WHERE product_id BETWEEN $product_id_range0000
                         AND $product_id_range9999  
";

【讨论】:

我有一个保存 '110301' 值的 php 变量,所以我不想做数学运算,想获得一个依赖于 '110301' 而不是 '1103010000' 或 '1103019999' 的查询跨度> 【参考方案3】:
SELECT * 
  FROM `product` 
 WHERE `product_id` >= 1103010000 
   AND `product_id` <= 1103019999

【讨论】:

我没有研究您的查询,但这可能是一个数学问题。即便如此,与此处提供的解决方案相比,它是一种更复杂的方法。始终使事情尽可能简单。 @bijibuji 我认为我发布的答案将解决原始解决方案不起作用的原因。 @John Conde:我有一个保存 '110301' 值的 php 变量,所以我不想做数学运算,想要获得一个依赖于 '110301' 而不是 '1103010000' 或 ' 的查询1103019999'【参考方案4】:

MySQL documentation 表示LIKE 也使用索引,所以我认为您也可以使用:

SELECT *
FROM `product`
WHERE product_id LIKE '110301____' -- four undersores as biziclop suggested

编辑:要修复您自己的查询,您需要使用FLOOR() (documentation),因为它的结果类似于:

1103010006 / 10000

结果为 110301,0006 且不等于 110301

【讨论】:

我会使用LIKE '110301____'来避免与1103010等匹配 问题是当LIKEing 对数字字段时 MySQL 如何使用索引。【参考方案5】:

您可以像这样使用 MySQL 整数除法运算符DIV:

SELECT * FROM `product` WHERE (product_id DIV 10000)=110301

对于 BIGINT 也是安全的。

【讨论】:

【参考方案6】:

MYSQL Documentation,我想,解释了为什么会发生这种情况;

只有在 将其结果转换为整数的上下文。

因此,如果将结果转换为整数,它可能会起作用。

编辑: 试试

SELECT * FROM `product` WHERE cast((product_id/10000) as int) = 110301  

【讨论】:

谢谢!但是如何将结果转换为整数?哪个结果?

以上是关于MySQL中的整数除法的主要内容,如果未能解决你的问题,请参考以下文章

大整数除法表示为 C++ 中的字符串

解决“浮点上下文中的整数除法”警告

Dhall中的整数除法

Java中的整数除法[重复]

Java中的整数除法[重复]

为啥整数除法产生一个浮点数而不是另一个整数?