请有人帮我。除非我错过了令人眼花缭乱的明显,否则我总是难倒。
当我要求价格列中的所有内容小于或等于6,并且在分钟列中每个都大于或等于500时,此查询如何返回该行。
价格是一个int
CREATE TABLE `gg_Crates` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`price` int(11) NOT NULL,
`minutes` varchar(11) COLLATE utf8_unicode_ci NOT NULL,
`sms` varchar(11) COLLATE utf8_unicode_ci NOT NULL,
`data` varchar(11) COLLATE utf8_unicode_ci NOT NULL,
`url` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`bb` int(5) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
答案 0 :(得分:2)
您正在获取该行,因为您正在比较字符串。 "500" >= "60"
为真,因为ASCII字符顺序。
您必须更改minutes
列的类型或在过滤数据时解析值。例如
SELECT *, CONVERT(minutes,UNSIGNED INTEGER) AS minutes_int
...
WHERE
...
AND `minutes_int` >= 600
...
也可以尝试直接将字符串值与整数值进行比较,例如
AND `minutes` >= 600
删除逗号,但我建议您考虑更改列格式,如果可能的话,因为将分钟表示为varchar(11)
是不正确的,并且还会让您占用大量空间。
答案 1 :(得分:0)
在mysql中,不应在查询中引用数字。它看起来引用500
导致mysql在"500"
和`分钟之间进行字符串比较,而不是数字比较。
删除数字周围的引号,它将按预期工作。
答案 2 :(得分:0)
您正在比较两个字符串并期望数字比较输出。换句话说,您想要500 >= 60
,但实际上您运行"500" >= "60"
,这意味着STRCMP("500", "60")
,其结果不同。
将您的列转换为整数,然后使用数字进行比较。
WHERE CONVERT(minutes, UNSIGNED INTEGER) >= 500
答案 3 :(得分:-1)
尝试在条件中使用括号( )
。类似的问题也发生在我身上。
有时,当未使用括号时,引擎不会捕获AND
运算符。