0

我有一个价格结构如下的 MySQL 表:

-------------------- 
| 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

4 回答 4

4

您应该将其存储为字符串或 varchar。它现在执行的方式是比较字符串,这就是你没有结果的原因。如果我是你,我将通过将列更改PriceINTor来重组表格DECIMAL,或者只要它是一个数字就可以。

但是要直接回答您的问题,您可以这样做,但如果您定义了一个索引,则不使用任何索引。

WHERE CAST(REPLACE(REPLACE(price,'$',''),',','') AS SIGNED) 
      BETWEEN 2999 AND 20000
于 2013-07-13T19:57:11.463 回答
2

您似乎将价格存储为字符串而不是数字。“$2999”和“$20000”之间没有任何内容,因为“$2999”>“$20000”按字母顺序排列。

这是解决此问题的一种方法:

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

更好的方法是将“价格”存储为数字而不是字符。

于 2013-07-13T19:57:33.397 回答
1

我想 Price 是一个文本字段,而不是一个数字字段。因此,当您尝试获取 $2999 和 $20000 之间的行时,不会返回任何内容,因为与字符串相比,实际上 20000 小于 2999。

您必须将该列转换为具有两个小数点的十进制数据类型。

于 2013-07-13T19:57:31.263 回答
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";

于 2013-07-13T19:57:40.043 回答