什么是最快和/或最简单的方法呢?

时间:2013-02-15 08:29:10

标签: mysql sql database

我有下表和查询:

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的示例,如您所见。 我需要在此查询中添加以下两个条件:

  1. 如果引入值的范围是所有值中的最小值 表,查询只返回具有该行的数据 最小的价值。例如:如果我有值9和10,那么 结果将是id_size 7,因为它是较小的那个 号。

  2. 如果引入值的范围是所有值中的最大值 表,查询只返回具有该行的数据 最大的价值。例如:如果我有值112和113,那么 结果将是id_size 5,因为它是具有更大的那个 号。


  3. 您知道如何将上述条件添加到我的查询中吗? 我可以简化它吗?

1 个答案:

答案 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;
;