或最简单的方法是什么

或最简单的方法是什么

我有下表和查询:

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/

10-10 00:52