2013-02-14 160 views
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 

或者,如果我有更高的價值,我會需要大小的ID至少有第二個更高的值。

那麼,如果我發佈第一個查詢不會有任何結果,我這樣做: http://sqlfiddle.com/#!2/83e93/32/0

它努力。所以,我的問題是: 我可以只用一個查詢來做同樣的事情嗎?

我希望我在我的解釋中很清楚,我會很感激任何幫助。 在此先感謝。

回答

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 Demo

更新 - 示例

下面我提供了更多更接近例如你的需要: 刪除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 Demo

+0

是的,我修改它,它的工作原理:http://sqlfiddle.com/#!2/83e93/32/0。但再讀一遍我的第一篇文章,我已經編輯過它,也許你知道一個更好的解決方案。 – harrison4 2013-02-14 12:07:18

+0

看到這個:http://sqlfiddle.com/#!2/83e93/53如果這可以幫助 – Minesh 2013-02-14 12:28:19

+0

真的感謝Minesh,但它返回1和2個ID。 id_size 5的值是83和86.是最高的,所以它會返回第二個最高值的id。我在第一篇文章中解釋它。 – harrison4 2013-02-14 12:42:52