我在一个表中有一个Resolution
列,其中的分辨率是空间分隔的,例如:1024 768
。
我想选择所有在a和b之间有width
(第一个数字)的行。
我怎么能用mysql写这样的东西呢?
假设a是500,b是1200,resolution
是列的名称。SELECT * FROM myTable WHERE first_value(resolution) > 500 AND first_value(resolution) < 1200.
我可以使用什么来获取空格分隔字符串的first_value
作为数字?
最佳答案
您可以使用SUBSTRING_INDEX()
(请参阅此sqlfiddle):
SELECT *
FROM myTable
WHERE SUBSTRING_INDEX(resolution, ' ', 1) > 500 AND SUBSTRING_INDEX(resolution, ' ', 1) < 1200;
特别注意:请注意,使用此方法将无法利用表上的任何索引(随着表变大,此查询将变得慢得多)。因为需要用函数拆分每一行,所以此查询无法使用索引筛选此数据。理想情况下,您应该在insert时将这些数据分割成两个独立的列(我将研究如何使用触发器,或者可能修改代码以不同方式插入数据),然后以这种方式过滤数据。
以下是如何执行简单的触发器:
CREATE TABLE IF NOT EXISTS `test` (
`id` int(6) unsigned NOT NULL AUTO_INCREMENT,
`resolution` varchar(255) NOT NULL,
`resolution_width` int(11) signed NULL,
`resolution_height` int(11) signed NULL,
PRIMARY KEY (`id`) -- DON'T FORGET YOUR INDEX ON resolution_width and resolution_height
-- (Or all this will be for naught)
) DEFAULT CHARSET=utf8 //
--Be sure to add a similar one for BEFORE UPDATE if you're updating data as well
CREATE TRIGGER MyTrigger BEFORE INSERT ON `test`
FOR EACH ROW BEGIN
SET NEW.resolution_width = CAST(SUBSTRING_INDEX(NEW.resolution, ' ', 1) AS SIGNED),
NEW.resolution_height = CAST(SUBSTRING_INDEX(NEW.resolution, ' ', -1) AS SIGNED);
END//
INSERT INTO `test` (`resolution`) VALUES ('1100 2200');
关于mysql - MySQL选择从空格分隔的字符串中比较数字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48481741/