2012-06-29 23 views
8

Tôi có một bảng MySQL trong đó có một product_id lĩnh vực (số nguyên lớn)Integer trong MySQL

1102330008 1102330025 1102330070 1103010009 1103010010 1103020006 ...

Tôi muốn để chọn các hàng có product_id = 110301****. Tôi cố gắng để sử dụng truy vấn này:

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

nhưng nó không trả lại bất kỳ giá trị với tin nhắn này:

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

+0

Tại sao bạn sử dụng phân chia chứ không phải 'BETWEEN' hoặc' < > '? – biziclop

Trả lời

2

MySQL documentation nói rằng LIKE còn sử dụng chỉ số vì vậy tôi nghĩ rằng bạn cũng có thể sử dụng:

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

chỉnh sửa: để sửa truy vấn riêng của bạn, bạn sẽ cần phải sử dụng FLOOR() (documentation) vì nó là kết quả một cái gì đó như:

1103010006/10000 

mà kết quả 110301,0006 và nó không phải bằng 110301

+1

Tôi sẽ sử dụng 'LIKE '110301 ____' 'để tránh khớp với' 1103010', v.v. – biziclop

+0

@biziclop cảm ơn. Tôi đã không khó khăn của nó theo cách đó :) – Teneff

+0

Câu hỏi đặt ra là làm thế nào MySQL sử dụng các chỉ mục khi 'LIKE'ing chống lại các trường số. – biziclop

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

Tại sao không làm việc bằng (=)? !! –

+0

Tôi đã không nghiên cứu truy vấn của bạn nhưng nó có thể là một vấn đề toán học. Mặc dù vậy, nó là một cách phức tạp hơn để làm điều đó sau đó các giải pháp được cung cấp ở đây. Luôn giữ mọi thứ càng đơn giản càng tốt. –

+0

@bijibuji Tôi nghĩ rằng câu trả lời tôi đăng sẽ giải quyết lý do giải pháp gốc không hoạt động. –

8
SELECT * 
FROM product 
WHERE product_id BETWEEN 1103010000 
        AND 1103019999 

Nếu bạn muốn tạo của bạn truy vấn trong PHP, khi đó bạn có thể tạo truy vấn của mình như

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

+1 để nhắc nhở Tôi có BETWEEN –

+0

Tôi có một biến php giữ giá trị '110301', vì vậy tôi không muốn làm toán và muốn đạt được một truy vấn dựa trên '110301' không '1103010000' hoặc '1103019999' –

1

MYSQL Documentation, tôi nghĩ, giải thích tại sao điều này xảy ra;

Phân chia chỉ được tính bằng số học BIGINT nếu được thực hiện trong ngữ cảnh trong đó kết quả của nó được chuyển thành số nguyên.

Vì vậy, nếu bạn chuyển đổi kết quả thành số nguyên, nó có thể hoạt động.

Edit: Hãy thử

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

Cảm ơn! nhưng làm thế nào tôi có thể chuyển đổi kết quả thành số nguyên? kết quả là gì? –

2

Bạn có thể sử dụng toán tử phân chia MySQL Integer DIV như thế này:

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

Cũng an toàn cho BIGINT.

15

Sử dụng DIV operator.

mysql> SELECT 5 DIV 2; 
    -> 2 

Phân tách số nguyên.Tương tự như FLOOR(), nhưng an toàn với các giá trị BIGINT. Kết quả không chính xác có thể xảy ra cho các toán hạng không phải là bội số vượt quá phạm vi BIGINT.