0

この構造のテーブルがあります:

CREATE  TABLE IF NOT EXISTS `mydb`.`sizes` (
  `id_size` INT NOT NULL ,
  `cm_min` INT NOT NULL ,
  `cm_max` INT NOT NULL ,
  PRIMARY KEY (`id_size`) )
ENGINE = InnoDB;

このクエリは、サイズ 5 の幅と高さを返します。

select cm_min, cm_max from sizes where id_size = 5;

それは:

45, 56

さて、この範囲の cm_min または cm_max を持つすべてのサイズを取得したいと思います。私はこのようなことを考えました:

http://sqlfiddle.com/#!2/83e93/51

動作しますが、どの範囲にも収まらないサイズがあります。つまり、私がこれを持っている場合:

id_size    cm_min    cm_max
1          56        59
2          63        67
3          70        74
4          76        79
5          83        86
6          60        62
7          12        14

id_size 6 の値があり、前のクエリを実行すると、選択された 0 行が返されます。厳密には値の間ではありませんが、これよりも大きいサイズと小さいサイズの id_size を取得したいと考えています。この場合、以下が返されます。

id_size    cm_min    cm_max
1          56        59
2          63        67

または、たとえば、マイナー値である te id_size 7 の値がある場合、次のマイナー値を取得する必要があります。私の場合は次のとおりです。

id_size    cm_min    cm_max
1          56        59

または、値が大きい場合は、2 番目に大きい値を持つサイズの ID が必要です。

次に、投稿した最初のクエリに結果がない場合は、これを行います: http://sqlfiddle.com/#!2/83e93/32/0

それはに働きます。だから、私の質問は: 1 つのクエリだけで同じことができますか?

説明が明確であったことを願っています。助けていただければ幸いです。前もって感謝します。

4

1 に答える 1

1

以下の SQL は、開始するのに役立ちます。これにより、選択した ID よりも高いまたは低いすべての行が返されます。たとえば、ここでは id = 6 の場合です。

SELECT id_size 
FROM sizes 
WHERE (cm_min < 60 or  cm_min > 62) and
(cm_max < 60 or cm_max > 62);

SqlFiddle デモ

更新 - 例

以下に、必要に応じたより近い例を示します。LIMIT 1すべてのレコードが必要な場合は削除してください。

SELECT id_size , 'lower'
FROM sizes 
WHERE (cm_min < 12 AND cm_max < 12)  
LIMIT 1
UNION
SELECT id_size , 'HIGHER'
FROM sizes 
WHERE (cm_min > 14 AND cm_max > 14)
LIMIT 1

SqlFiddle デモ

于 2013-02-14T10:24:12.807 に答える