MySQL select 比较 space 分隔字符串中的数字

MySQL select compare numbers from space separated string

我在 table 中有一个 Resolution 列,其中分辨率为 space 分隔,例如:1024 768.

我想 select 在 A 和 B 之间具有 width(第一个数字)的所有行。

如何在 MySQL 中写出这样的内容?

假设 A 是 500,B 是 1200,resolution 是列的名称。

SELECT * FROM myTable WHERE first_value(resolution) > 500 AND first_value(resolution) < 1200.

我可以使用什么来获取 space 分隔字符串的 first_value 作为数字?

您可以使用 SUBSTRING_INDEX() (See this sqlfiddle):

SELECT *
FROM myTable
WHERE SUBSTRING_INDEX(resolution, ' ', 1) > 500 AND SUBSTRING_INDEX(resolution, ' ', 1) < 1200;

特别说明:请注意,使用此方法将无法利用 table 上的任何索引(此查询将变得更慢,因为 table变大)。因为您需要使用函数拆分每一行,所以此查询无法使用索引来过滤此数据。理想情况下,您应该在插入时将这些数据拆分为两个单独的列(我会考虑使用触发器,或者可能修改您的代码以不同方式插入数据),然后以这种方式过滤数据。

这里是你如何做一个简单的触发器:

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');