mysql - 你能简化这个查询吗?

标签 mysql sql

我有一个具有以下结构的表:

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

它有效。所以,我的问题是: 我可以只使用一个查询执行相同的操作吗?

我希望我的解释很清楚,如果有任何帮助,我将不胜感激。 提前致谢。

最佳答案

下面的 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

关于mysql - 你能简化这个查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14872158/

相关文章:

android - 带连接的 greenDAO queryBuilder

sql - 如何根据表的存在用sql复制表模式?

mysql - 如何在android中的 TextView 中发布MySQL数据

php - mysql关于html和php的问题

php - Sql,知道记录是否存在,在哪个表中

sql - 选择计数(*)或零

sql - 使用来自 Oracle 数据库的 SQL 从 XML Clob 中提取数据

mysql - max_allowed_pa​​cket 正在重置为 1024,因为某些未知应用程序

mysql - 不正确的日期时间值 '0000-00-00 00:00:00' - Date_Sub() in Having

mysql - SQL 查询多个表,具有多个联接和带有逗号分隔列表的列字段