mysql BETWEEN将返回0行

时间:2013-07-13 19:54:00

标签: php mysql between

我有一个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 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分: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";