2012-06-29 6 views
8

Ich habe eine MySQL-Tabelle, die eine product_id Feld (big integer) hatInteger-Division in MySQL

1102330008 1102330025 1102330070 1103010009 1103010010 1103020006 ...

Ich möchte um Zeilen auszuwählen, die product_id = 110301**** haben. Ich habe versucht, diese Abfrage zu verwenden:

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

aber es liefert keine Werte mit dieser Nachricht:

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

+0

Warum verwenden Sie Division und nicht "BETWEEN" oder "< >"? – biziclop

Antwort

2

MySQL documentation sagt, dass LIKE auch Indizes verwendet, damit ich glaube, Sie auch nutzen könnten:

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

edit: Ihre eigene Abfrage beheben müssten Sie FLOOR() (documentation) verwenden, weil es etwas Ergebnisse wie:

1103010006/10000 

die Ergebnisse 110301,0006 und es ist nicht gleich 110301

+1

Ich würde 'LIKE verwenden '110301 ____' 'zu vermeiden, mit' 1103010', etc. zu passen – biziclop

+0

@biziclop danke. Ich habe es nicht so schwer :) – Teneff

+0

Die Frage ist, wie MySQL Indizes verwendet, wenn "LIKE" gegen numerische Felder. – biziclop

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

Warum funktioniert das gleich (=) nicht? !! –

+0

Ich habe Ihre Anfrage nicht recherchiert, aber es könnte ein mathematisches Problem sein. Trotzdem ist es eine kompliziertere Art, dies zu tun als die hier angebotenen Lösungen. Halte die Dinge immer so einfach wie möglich. –

+0

@bijibuji Ich denke, die Antwort, die ich gepostet habe, würde den Grund ansprechen, warum die ursprüngliche Lösung nicht funktioniert. –

8
SELECT * 
FROM product 
WHERE product_id BETWEEN 1103010000 
        AND 1103019999 

Wenn Sie Ihren erstellen Abfrage in PHP, dann können Sie Ihre Abfrage wie

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

+1 für die Erinnerung beruht Ich von BETWEEN –

+0

Ich habe eine PHP-Variable, die den '110301' Wert enthält, also möchte ich nicht Mathe und möchte eine Abfrage erhalten, die auf '110301' nicht '1103010000' oder '1103019999' –

1

MYSQL Documentation, ich denke, erklärt, warum dies auftritt;

Eine Teilung ist nur mit BIGINT Arithmetik berechnet, wenn in einem Rahmen durchgeführt, wobei das Ergebnis in eine ganze Zahl umgewandelt wird.

Also, wenn Sie das Ergebnis in eine ganze Zahl konvertieren, kann es funktionieren.

Edit: Versuchen

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

Danke! aber wie kann ich das ergebnis in ganzzahl konvertieren? Welches Ergebnis? –

2

Sie können die MySQL Integer-Division Operator DIV wie folgt verwenden:

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

auch sicher für BIGINT.

15

Verwenden Sie die DIV operator.

mysql> SELECT 5 DIV 2; 
    -> 2 

Integer-Division.Ähnlich wie FLOOR(), ist aber sicher mit BIGINT-Werten. Falsche Ergebnisse können für nicht ganzzahlige Operanden auftreten, die den BIGINT-Bereich überschreiten.