Php mysql将返回0行
我有一个价格结构如下的MySQL表:Php mysql将返回0行,php,mysql,between,Php,Mysql,Between,我有一个价格结构如下的MySQL表: -------------------- | Price | item_id | -------------------- |$10,999| 123 | |$5,889 | 321 | |$2999 | 143 | |------------------| 现在如果我质疑这个问题: SELECT * FROM products WHERE price BETWEEN "$2999" AND "$6000"; SEL
--------------------
| 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";
它将返回两行。但如果我质疑这一点:
SELECT * FROM products WHERE price BETWEEN "$2999" AND "$6000";
SELECT * FROM products WHERE price BETWEEN "$2999" AND "$20000";
它不会返回任何行,因为它至少要返回3行
请注意,还有许多其他行是11000美元,以此类推
任何帮助都将不胜感激 您应该将其存储为string或varchar。它现在执行的方式是比较字符串,这就是为什么没有结果。如果我是您,我将通过将列
Price
更改为INT
或DECIMAL
,或任何只要是数字的内容来重新构造表
但要直接回答您的问题,您可以这样做,但如果您已经定义了索引,则不使用任何索引
WHERE CAST(REPLACE(REPLACE(price,'$',''),',','') AS SIGNED)
BETWEEN 2999 AND 20000
我认为Price是一个文本字段,而不是一个数字字段。因此,当您尝试获取$2999和$20000之间的行时,不会返回任何内容,因为实际上20000比2999小(作为字符串比较)
您必须将该列转换为带有两个小数点的十进制数据类型。似乎将价格存储为字符串而不是数字。“$2999”和“$20000”之间没有任何内容,因为“$2999”>按字母顺序排列的“$20000” 以下是解决此问题的一种方法:
SELECT
FROM products
WHERE cast(replace(replace(price, '$', ''), ',') as signed) BETWEEN 2999 AND 20000;
更好的方法是将“价格”存储为数字而不是字符。删除
$
,只保留数字。您不需要在DB中保存带数字的美元符号
从价格>2999且价格<6000的产品中选择*代码>
从价格>2999且价格<20000的产品中选择*代码>
或
从价格介于2999和6000之间的产品中选择*;
从价格介于2999和20000之间的产品中选择*
在mysql
中,您应该使用SIGNED
或UNSIGNED
,否则它将抛出一个错误。@491243。非常感谢。我知道。每次在MySQL中需要一个整数字段时,我都会很方便地忘记它。这仍然会返回0行吗?但我使用了CAST(替换(替换…);它是有效的,但性能和响应确实很慢。你是说比较20000和2999,20000更小?比如20000<2999?是的,当你将它们作为字符串进行比较时。这非常有效!向上投票,但您能解释一下它是否会影响页面的性能吗?@Ahsan您必须将该列转换为十进制类型并向其添加索引,因为您将使用该列运行许多查询,以获得最佳性能。谢谢您,这样做了,获得了最佳性能!