获取价格介于 100000 和 10000000 之间的所有数据

Eph*_*nga 3 mysql mysql-5.6

我有一个articles名为price.

当我的 Web 应用程序上的用户同时选择Price Min和 时Price Max,我需要执行如下查询:

$priceMin = 100000;
$priceMax = 10000000;

$query = 'SELECT * FROM articles WHERE price BETWEEN $priceMin AND $priceMax';
Run Code Online (Sandbox Code Playgroud)

然而,当所选择的Price Min is <= 100000Price Max is >= 10000000(10元),我没有与任何输出Price大于900000即使以上值的行900000确实存在。

该表定义如下:

CREATE TABLE articles ( 
 id int(11) NOT NULL AUTO_INCREMENT, 
 name varchar(100) NOT NULL, 
 price varchar(100) NOT NULL, 
 source varchar(255) NOT NULL, PRIMARY KEY (id) 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 
Run Code Online (Sandbox Code Playgroud)

Han*_*non 9

将数字数据存储在 varchar 列中会导致您遇到困难。

您可以通过一个非常简单的测试看到这种效果。

首先是一个包含两列的表,我们将在其中存储相同的数据;一列是 varchar,另一列是整数。

CREATE TABLE test
(
    v varchar(100) NOT NULL
    , n int NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

插入一些示例数据:

INSERT INTO test (v, n)
VALUES (0, '0')
    , (1, '1')
    , (2, '2')
    , (100, '100')
    , (99, '99');
Run Code Online (Sandbox Code Playgroud)

显示按 varchar 列排序的数据:

SELECT *
FROM test
ORDER BY v;
Run Code Online (Sandbox Code Playgroud)

结果:

????????????
? ? ?
????????????
? 0 ? 0 ?
? 1 ? 1 ?
? 100 ? 100 ?
? 2 ? 2 ?
? 99 ? 99 ?
????????????

显示数据,按整数列排序:

SELECT *
FROM test
ORDER BY n;
Run Code Online (Sandbox Code Playgroud)
????????????
? ? ?
????????????
? 0 ? 0 ?
? 1 ? 1 ?
? 2 ? 2 ?
? 99 ? 99 ?
? 100 ? 100 ?
????????????

varchar 列按字母顺序排序,而 integer 列按数字排序。

您应该考虑将price列更改为支持所需精度和大小的数字数据类型。有关定点数据类型的更多详细信息,请参阅 MySQL 开发人员指南。我建议考虑decimal(18, 4)作为价格的起点。18 位是精度,即可以存储的总位数。4是刻度,即小数点右边的位数。如果将price列定义为decimal(18, 4),它将能够存储诸如 99999999999999.9999 之类的值,并允许它们正确排序。将列定义为 varchar 是有问题的,因为它允许您存储hedgehog以及10000,这会导致各种各样的问题,其中最重要的是无法获得一组物品的总价格。


Tom*_*m V 7

虽然我同意 Max Vernon 在他的回答中的基本问题是您的设计将价格存储在文本列中,但您可以通过在比较之前将您的值转换为数字来摆脱此查询。

这个db<>fiddle显示了在排序/比较之前转换为数字的效果。

但是请记住,您的设计会不断给您带来问题,因为在比较它们或对它们执行微积分时,您总是必须将字符串转换为数字(加法可能会导致串联),因此最好的解决方案是,如Max 建议使用正确的数据类型。