2012-06-29 53 views
8

我有具有product_id場(大整數)整數除法在MySQL

1102330008 1102330025 1102330070 1103010009 1103010010 1103020006 ...

我想要一個MySQL表選擇具有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)

+0

你爲什麼使用除法而不是'BETWEEN'或'< >'? – biziclop

回答

2

MySQL documentationLIKE也使用索引,所以我想你也可以使用:

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

編輯:來解決自己的查詢就需要使用FLOOR()documentation),因爲它會導致什麼像:

1103010006/10000 

導致110301,0006,它不等於110301

+1

我會使用'LIKE '110301 ____''以避免與'1103010'等匹配 – biziclop

+0

@biziclop謝謝。我沒有那麼強硬:) – Teneff

+0

問題是,當LIKE對數字字段時,MySQL如何使用索引。 – biziclop

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

爲什麼不平等(=)的工作?! –

+0

我沒有研究你的查詢,但它可能是一個數學問題。即便如此,這是一個更復雜的方法來做到這一點,然後在這裏提供的解決方案。始終保持儘可能簡單的事情。 –

+0

@bijibuji我認爲我發佈的答案將解決原始解決方案不起作用的原因。 –

8
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 
"; 
+0

+1提醒的查詢我的BETWEEN –

+0

我有一個PHP變量,保存'110301'值,所以我不想做數學,並希望獲得一個依賴'110301'而不是'1103010000'或'1103019999' –

1

MYSQL Documentation,我想,解釋了爲什麼會發生這種情況;

只有在其結果轉換爲整數的 上下文中執行,纔會使用BIGINT算術計算除法。

所以,如果你將結果轉換爲整數,它可能會工作。

編輯: 嘗試

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

謝謝!但我怎樣才能將結果轉換爲整數?哪個結果? –

2

您可以使用MySQL的整數除法運算DIV這樣的:

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

而且安全的BIGINT。

15

使用DIV operator

mysql> SELECT 5 DIV 2; 
    -> 2 

整數除法。與FLOOR()類似,但使用BIGINT值是安全的。對於超過BIGINT範圍的非整數操作數可能會出現錯誤的結果。