18

我有一个 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 )

4

6 回答 6

39

使用DIV运算符

mysql> SELECT 5 DIV 2;
    -> 2

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

于 2013-06-18T15:23:11.497 回答
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  
";
于 2012-06-29T14:08:40.773 回答
3
SELECT * 
  FROM `product` 
 WHERE `product_id` >= 1103010000 
   AND `product_id` <= 1103019999
于 2012-06-29T14:08:16.210 回答
2

MySQL 文档说它LIKE也使用索引,所以我认为你也可以使用:

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

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

1103010006 / 10000

结果 110301,0006 不等于110301

于 2012-06-29T14:11:20.620 回答
2

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

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

对于 BIGINT 也很安全。

于 2013-01-02T22:34:50.943 回答
1

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

仅当在结果转换为整数的上下文中执行除法时,才使用 BIGINT 算术计算除法。

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

编辑: 试试

SELECT * FROM `product` WHERE cast((product_id/10000) as int) = 110301  
于 2012-06-29T14:55:25.190 回答