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
等匹配
问题是当LIKE
ing 对数字字段时 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中的整数除法的主要内容,如果未能解决你的问题,请参考以下文章