2012-06-29 43 views
8

Tengo una tabla de MySQL que tiene un campo de product_id (entero grande)división de enteros en MySQL

1102330008 1102330025 1102330070 1103010009 1103010010 1103020006 ...

quiero para seleccionar las filas que tienen product_id = 110301****. He intentado utilizar esta consulta:

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

pero no devuelve ningún valor con este mensaje:

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

+0

¿Por qué usa la división y no 'BETWEEN' or' < >'? – biziclop

Respuesta

2

MySQL documentation dice que LIKE también utiliza los índices así que creo que también se puede utilizar:

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

edición: para fijar su propia consulta que tenga que utilizar FLOOR() (documentation) porque da lugar a algo como:

1103010006/10000 

qué resultados 110301,0006 y no es igual a 110301

+1

yo usaría 'COMO '110 301 ____' 'para evitar que emparejan con' 1103010', etc. – biziclop

+0

@biziclop gracias. Tengo que no sea resistente de esa manera :) – Teneff

+0

La cuestión es cómo utiliza MySQL los índices cuando 'LIKE'ing contra los campos numéricos. – biziclop

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

¿Por qué no funciona el igual (=)? –

+0

No investigé su consulta, pero podría ser un problema matemático. Aun así, es una forma más complicada de hacerlo que las soluciones proporcionadas aquí. Siempre mantenga las cosas lo más simples posible. –

+0

@bijibuji Creo que la respuesta que he publicado aborde la razón por la solución original no funciona. –

8
SELECT * 
FROM product 
WHERE product_id BETWEEN 1103010000 
        AND 1103019999 

Si desea crear su consulta en PHP, luego puede construir su consulta como

$sql = " 
    SELECT * 
    FROM product 
    WHERE product_id BETWEEN {$product_id_range}0000 
         AND {$product_id_range}9999 
"; 
+0

1 para recordar me entre –

+0

tengo una variable php que tiene el '110301' valor, por lo que no quiero hacer matemáticas y quiero ganar una consulta que se basa en '110301' no '1103010000' o '1103019999' –

1

MYSQL Documentation, creo, explica por qué ocurre esto;

Una división se calcula con BIGINT aritmética solamente si se realiza en un contexto donde su resultado se convierte a un entero.

Así que si convierte el resultado a un número entero, puede funcionar.

Editar: Trate

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

Gracias! pero ¿cómo puedo convertir el resultado a entero? ¿Cuál resultado? –

2

Usted puede utilizar el operador de división de enteros MySQL DIV así:

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

también seguro para BIGINT.

15

Utilice DIV operator.

mysql> SELECT 5 DIV 2; 
    -> 2 

La división entera.Similar a FLOOR(), pero es seguro con los valores de BIGINT. Pueden ocurrir resultados incorrectos para operandos no enteros que exceden el rango BIGINT.

Cuestiones relacionadas