2013-07-13 66 views
0

我有一個MySQL表的價格結構是這樣的:MySQL之間的將返回0行

-------------------- 
| Price | item_id | 
-------------------- 
|$10,999| 123  | 
|$5,889 | 321  | 
|$2999 | 143  | 
|------------------| 

現在,如果我查詢此:

SELECT * FROM products WHERE price BETWEEN "$2999" AND "$6000"; 

它將返回兩行。但如果我查詢到:

SELECT * FROM products WHERE price BETWEEN "$2999" AND "$20000"; 

它不會返回任何行,因爲它預計會返回至少3行?

請注意,還有很多其他的行藏漢這是$ 11,000等等...

任何幫助,將不勝感激!

回答

4

您應該將其存儲爲字符串或varchar。它現在執行的方式是比較字符串,這就是爲什麼你沒有結果。如果我是你,我將通過將列Price更改爲INTDECIMAL或其他任何只要它是一個數字來重組表格。

但是要直接回答你的問題,你可以做到這一點,但如果你定義了一個,就不會使用任何索引。

WHERE CAST(REPLACE(REPLACE(price,'$',''),',','') AS SIGNED) 
     BETWEEN 2999 AND 20000 
+0

這真是棒極了!已投票,但你能解釋它是否會影響頁面的性能? – Ahsan

+0

@Ahsan您必須將列轉換爲十進制類型併爲其添加索引,因爲您將使用此列運行許多查詢以獲得最佳性能。 –

+0

謝謝,相應地,得到了最好的! – Ahsan

1

我想價格是一個文本字段,而不是數字字段。所以,當你試圖在$ 2999和$ 20000之間讀取行時,不會返回任何內容,因爲實際上,與字符串比較時,20000小於2999。

您必須將列轉換爲帶有兩個小數點的十進制數據類型。

+0

你的意思是比較20000和2999,20000更小?像20000 <2999? – Ahsan

+0

是的,當你比較他們作爲字符串。 –

2

您似乎將價格存儲爲字符串而不是數字。 「2999美元」和「20000美元」之間沒有任何差別,因爲「2999美元」>「20000美元」按字母順序排列。

這裏是解決這個問題的一種方法:

SELECT 
FROM products 
WHERE cast(replace(replace(price, '$', ''), ',') as signed) BETWEEN 2999 AND 20000; 

一種更好的方式是將「價格」存儲爲數字而不是一個字符。

+0

在'mysql'中,你應該使用'SIGNED'或'UNSIGNED',否則會拋出錯誤。 –

+0

@ 491243。 。 。謝謝。我知道。每次我想在MySQL中使用整數字段時,我都會很方便地忘記它。 –

1

刪除$並僅保留數字。您無需在數據庫中存儲帶有數字的美元符號。

SELECT * FROM products WHERE price > 2999 AND price < 6000;
SELECT * FROM products WHERE price > 2999 AND price < 20000;

SELECT * FROM products WHERE price BETWEEN 2999 AND 6000";
SELECT * FROM products WHERE price BETWEEN 2999 AND 20000";

+0

這仍然會返回0行?但我已經使用CAST(替換(替換..));它的工作,但表現和反應確實緩慢。 – Ahsan