我在表格中有一个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
作为数字?
答案 0 :(得分:2)
您可以使用SUBSTRING_INDEX()
(请参阅此sqlfiddle):
SELECT *
FROM myTable
WHERE SUBSTRING_INDEX(resolution, ' ', 1) > 500 AND SUBSTRING_INDEX(resolution, ' ', 1) < 1200;
特别说明:请注意,使用此方法将无法利用表中的任何索引(随着表变大,此查询将变得更慢)。因为您需要使用函数拆分每一行,所以此查询无法使用索引来过滤此数据。理想情况下,您应该在插入时将此数据拆分为两个单独的列(我将查看使用触发器,或者可能修改代码以不同方式插入数据),并以这种方式过滤数据。
以下是如何进行简单触发的方法:
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');