0

次のテーブルとクエリがあります。

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;

SqlFiddleでそれを参照してください


ご覧のとおり、値が12と66の例を次に示します。このクエリに次の2つの条件を追加する必要があります。

  1. 導入された値の範囲がすべてのテーブルの中で最小である場合、クエリは最小値を持つ行のデータのみを返します。例:値が9と10の場合、数値が小さいため、結果はid_size7になります。

  2. 導入された値の範囲がすべてのテーブルの中で最大である場合、クエリは最大値を持つ行のデータのみを返します。例:値が112と113の場合、数値が大きいため、結果はid_size5になります。


上記の条件をクエリに追加する方法を知っていますか?単純化できますか?

4

1 に答える 1

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;
;
于 2013-02-15T12:22:28.467 に答える