Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 最快和/或最简单的方法是什么?_Mysql_Sql_Database - Fatal编程技术网

Mysql 最快和/或最简单的方法是什么?

Mysql 最快和/或最简单的方法是什么?,mysql,sql,database,Mysql,Sql,Database,我有以下表格和查询: 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,

我有以下表格和查询:

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;
下面是一个值为12和66的示例,如您所见。 我需要在此查询中添加以下两个条件:

如果引入值的范围是所有值中最小的 表中,查询仅返回具有 最小值。例如:如果我有这些值​​第9条和第10条 结果将是id_大小7,因为它是具有较小 数字

如果引入值的范围是所有值中最大的 表中,查询仅返回具有 最大值。例如:如果我有值112和113,则 结果将是id_大小5,因为它是具有较大 数字

您知道如何将上述条件添加到我的查询中吗? 我可以简化它吗?

这应该可以解决问题。请注意,顺序是有效的,@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;
;

由于缺少括号,您的比较似乎有误。我想你需要像…和。。。或和而不是当前格式。。。和或和还有…谢谢,伙计,我已经修改过了。再次查看第一篇帖子我已经修改了一些东西,也许你现在可以帮助我了。哦,上帝!很好!真的谢谢。顺便问一下,这是更快的方法吗?不是。上面的查询不会针对搜索进行优化。您是如何获得搜索值的?u可能需要考虑有一个大小实体关系来规范这个搜索。@ JoaNead不知道您的表大小和索引,并运行一个解释选择…很难说是否有更快的方法。我将对你的问题进行编辑,使其更全面,然后你可以在后面添加更多关于附加条件的信息。好吧,这是对算法的更改-你希望v2比v1具有更大的权重。现在没时间了,星期一我得考虑一下。