我有下表和查询:
CREATE TABLE IF NOT EXISTS `sizes` (
`id_size` INT NOT NULL ,
`cm_min` INT NOT NULL ,
`cm_max` INT NOT NULL ,
PRIMARY KEY (`id_size`) )
ENGINE = InnoDB;
insert into sizes values
(1, 56, 59),
(2, 63, 67),
(3, 70, 74),
(4, 76, 79),
(5, 83, 86),
(6, 60, 62),
(7, 12, 14);
SELECT * FROM sizes
WHERE cm_min >= 13 AND cm_min <= 66 OR
cm_max >= 13 AND cm_max <= 66
AND cm_min =
(SELECT min(cm_max) FROM sizes
WHERE (cm_min >= 13 AND cm_min <= 66) OR
(cm_max >= 13 AND cm_max <= 66))
UNION
SELECT * FROM sizes
WHERE cm_min >= 13 AND cm_min <= 66 OR
cm_max >= 13 AND cm_max <= 66
AND cm_min =
(SELECT min(cm_min) FROM sizes
WHERE (cm_min >= 13 AND cm_min <= 66) OR
(cm_max >= 13 AND cm_max <= 66))
ORDER BY cm_max ASC;
See it in SqlFiddle
如您所见,这是一个具有值12和66的示例。
我需要在此查询中添加以下两个条件:
如果引入值的范围是所有
表中,查询仅返回具有以下内容的行的数据:
最小值。例如:如果我的值是9和10,则
结果将是id_size 7,因为它是较小的那个
数字。
如果引入值的范围是所有
表中,查询仅返回具有以下内容的行的数据:
最大的价值。例如:如果我具有值112和113,则
结果将是id_size 5,因为它是较大的那个
数字。
您知道如何将以上条件添加到我的查询中吗?
我可以简化一下吗?
最佳答案
这应该可以解决问题。请注意,顺序是有效的,@ v1必须是最小范围,@ v2是最大范围。
SET @v1=112, @v2=113;
SELECT *
FROM sizes
WHERE (
cm_min BETWEEN @v1 and @v2
AND
cm_max BETWEEN @v1 and @v2
)
OR
cm_min = (
SELECT MIN(cm_min)
FROM sizes
WHERE (@v1+@v2) <= (cm_min + cm_max)
)
UNION
SELECT *
FROM sizes
WHERE (
cm_min BETWEEN @v1 and @v2
OR
cm_max BETWEEN @v1 and @v2
)
OR
cm_max = (
SELECT MAX(cm_max)
FROM sizes
WHERE (@v1+@v2) >= (cm_min + cm_max)
)
ORDER BY cm_max ASC;
;
关于mysql - 最快和/或最简单的方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14890718/