2012-06-29 17 views
8

Mam tabeli MySQL, który ma product_id pole (duża liczba całkowita)Integer w MySQL

1102330008 1102330025 1102330070 1103010009 1103010010 1103020006 ...

chcę aby wybrać wiersze, które mają product_id = 110301****. Próbowałem użyć tej kwerendy:

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

ale nie zwraca żadnych wartości z tej wiadomości:

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

+0

Dlaczego używasz podział i nie 'BETWEEN' lub' '< >? – biziclop

Odpowiedz

2

MySQL documentation mówi, że LIKE wykorzystuje również indeksy więc myślę, że można również użyć:

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

edit: naprawić własne zapytanie będzie trzeba użyć FLOOR() (documentation), ponieważ wynika to coś jak:

1103010006/10000 

co powoduje 110301,0006 i nie jest równa 110301

+1

użyłbym "LIKE "110301 ____" ', aby uniknąć dopasowania z' 1103010', itp. – biziclop

+0

@biziclop dzięki. Nie tak trudno tego :) – Teneff

+0

Pytanie, w jaki sposób MySQL używa indeksów, gdy 'LIKE'ing przeciwko polom numerycznym. – biziclop

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

Dlaczego nie działa równy (=)? !! –

+0

Nie zbadałem Twojego zapytania, ale może to być problem z matematyką. Mimo to, jest to bardziej skomplikowany sposób, niż rozwiązania przedstawione tutaj. Zawsze utrzymuj rzeczy tak proste, jak to tylko możliwe. –

+0

@bijibuji Myślę, że odpowiedź, którą zamieściłem, dotyczy przyczyny, dla której oryginalne rozwiązanie nie działa. –

8
SELECT * 
FROM product 
WHERE product_id BETWEEN 1103010000 
        AND 1103019999 

Jeśli chcesz stworzyć swój zapytanie w PHP, możesz skonstruować zapytanie takie jak:

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

+1 za przypomnienie ME of BETWEEN –

+0

Mam zmiennej php, która ma wartość "110301", więc nie chcę matematyki i chcę uzyskać kwerendę, która opiera się na "110301", a nie "1103010000" lub "1103019999" –

1

MYSQL Documentation, Myślę, że wyjaśnia, dlaczego tak się dzieje;

Podział jest obliczana BIGINT tylko wtedy, gdy przeprowadza się w kontekście gdzie wynik jest przekształcany do liczby całkowitej.

Więc jeśli konwertujesz wynik na liczbę całkowitą, to może działać.

Edit: Spróbuj

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

Dzięki! ale jak mogę przekonwertować wynik na liczbę całkowitą? które wynikają? –

2

Można użyć MySQL Integer podziału operatora DIV tak:

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

także bezpieczne dla BIGINT.

15

Użyj DIV operator.

mysql> SELECT 5 DIV 2; 
    -> 2 

całkowita dzielenie.Podobne do FLOOR(), ale jest bezpieczne z wartościami BIGINT. Niepoprawne wyniki mogą wystąpić w przypadku nieoczekiwanych operacji przekraczających zakres BIGINT.