2013-02-14 118 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