我有下表和查询:
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;
这是一个值为12和66的示例,如您所见。 我需要在此查询中添加以下两个条件:
如果引入值的范围是所有值中的最小值 表,查询只返回具有该行的数据 最小的价值。例如:如果我有值9和10,那么 结果将是id_size 7,因为它是较小的那个 号。
如果引入值的范围是所有值中的最大值 表,查询只返回具有该行的数据 最大的价值。例如:如果我有值112和113,那么 结果将是id_size 5,因为它是具有更大的那个 号。
您知道如何将上述条件添加到我的查询中吗? 我可以简化它吗?
答案 0 :(得分:1)
这应该可以解决问题。 注意订单很重要,@ 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;
;