MySQL 中的整数除法

19
我有一个MySQL表,其中有一个名为product_id的字段(大整数)。

1102330008 1102330025 1102330070 1103010009 1103010010 1103020006 ...

我想选择那些product_id = 110301****的行。我尝试使用以下查询:
SELECT * FROM `product` WHERE (product_id/10000)=110301  

但是它返回了这个消息而没有任何值:

MySQL 返回了一个空结果集(即零行)。(查询耗时0.0005秒)


为什么你使用除法而不是 BETWEEN< > - biziclop
6个回答

42

使用DIV运算符

mysql> SELECT 5 DIV 2;
    -> 2

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


3
不是使用 FLOOR() 函数,而是使用 TRUNCATE() 函数。例如:select -5 div 2, floor(-5 / 2);,你会得到 -2, -3 - RnMss

9
SELECT *
FROM product
WHERE product_id BETWEEN 1103010000
                     AND 1103019999  

如果您想在PHP中创建查询,可以像这样构建您的查询:
$sql = "
    SELECT *
    FROM product
    WHERE product_id BETWEEN {$product_id_range}0000
                         AND {$product_id_range}9999  
";

我有一个保存着“110301”值的PHP变量,因此我不想进行数学计算,而是想获得一个依赖于“110301”而不是“1103010000”或“1103019999”的查询。 - biji buji

3
SELECT * 
  FROM `product` 
 WHERE `product_id` >= 1103010000 
   AND `product_id` <= 1103019999

我没有研究过你的问题,但它可能是一个数学问题。即便如此,这种方法比这里提供的解决方案更为复杂。总是尽可能保持简单。 - John Conde
@bijibuji 我认为我发布的答案可以解决原始解决方案无法工作的原因。 - David Manheim
@John Conde:我有一个保存着“110301”值的PHP变量,因此我不想进行数学计算,希望得到一个查询依赖于“110301”而不是“1103010000”或“1103019999”。 - biji buji

2
您可以使用MySQL整数除法运算符DIV,像这样:
SELECT * FROM `product` WHERE (product_id DIV 10000)=110301

同时适用于BIGINT。


2

MySQL文档表示,LIKE也使用索引,因此我认为您也可以使用:

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

编辑:要修复您自己的查询,您需要使用FLOOR()函数(文档),因为它会产生类似以下结果:

1103010006 / 10000

这导致的结果是110301,0006,而不等于110301


1
我会使用 LIKE '110301____' 来避免与 1103010 等匹配。 - biziclop
问题是MySQL在针对数字字段进行LIKE操作时如何使用索引。 - biziclop

1

MYSQL文档,我认为解释了为什么会出现这种情况;

只有在上下文中将其结果转换为整数时,才使用BIGINT算术计算除法。

因此,如果将结果转换为整数,则可能有效。

编辑:尝试

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

谢谢!但是我怎么把结果转换为整数?哪个结果? - biji buji

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接