检查是否存在范围为db的数字

6l7fqoea  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(363)

我需要找到一种有效的方法来找出用户提供的数字范围是否已经存在于db中可用的范围内。db中的数字表中有两列:起始数字和结束数字
假设存在一个范围,其中起始数字是:102,结束数字是122,那么下一个范围的起始数字是:123,或者可以是1到101之间的任何地方
例如,两个范围表列的值如下所示:
起始号码|结束号码

因此,如果用户试图创建一个新的范围,比如从190到220或85到105,他应该会得到一个错误,因为这个范围中的数字已经存在于db中的范围中。
因此,根据我上面的示例,应该始终允许用户创建1700以外的范围,比如1701到1750,或者缺少的范围,比如251到299,或者1251到1299。
我可以使用下面的查询解决大多数场景,但有一个场景我无法工作:
//对于可用的中间范围(不返回值:正常工作)

select * from range
where 121  BETWEEN StartingNumber and EndingNumber
or 149  BETWEEN   StartingNumber and EndingNumber;

//对于外部范围(不返回值:正常工作)

select * from range
where 1701  BETWEEN StartingNumber and EndingNumber
or 1800  BETWEEN   StartingNumber and EndingNumber;

//对于重叠范围(返回行,因此无法创建此范围:正常工作)

select * from range
where 150  BETWEEN StartingNumber and EndingNumber
or 160  BETWEEN   StartingNumber and EndingNumber;

//但是对于一个范围,比如说690到1800,它失败了,因为它不返回值,但是超过700到1700的范围已经被占用了

select * from range
where 690  BETWEEN StartingNumber and EndingNumber
or 1800  BETWEEN   StartingNumber and EndingNumber;

有没有办法让这最后一个条件也起作用?

ltskdhd1

ltskdhd11#

如果满足以下任一条件(可在sql查询中测试),则建议的新范围a..b不可用:
有一个db记录,其中sn<=a和en=>a(现有范围至少涵盖提议范围的低端)
存在一个db记录,其中sn<=b和en>=b(现有范围至少涵盖建议范围的高端)
存在一个db记录,其中sn<=a和b<=en(现有范围在建议范围内)

q0qdq0h2

q0qdq0h22#

您不需要获取所有行就可以找到一个范围。根据你问题的条件,只需要四个问题。

SELECT COUNT(*) FROM table_name_here WHERE 'InputStartingNumber' <= starting_number_column AND 'InputEndingNumber' >= ending_number_column;

SELECT COUNT(*) FROM table_name_here WHERE 'InputStartingNumber' <= ending_number_column AND 'InputEndingNumber' >= ending_number_column;

SELECT COUNT(*) FROM table_name_here WHERE 'InputStartingNumber' <= starting_number_column AND ending_number_column <= 'InputEndingNumber';

SELECT COUNT(*) FROM table_name_here WHERE 'InputStartingNumber' >= starting_number_column AND 'InputEndingNumber'<= ending_number_column;

如果这些查询中的任何一个返回的计数大于0,则表示该范围存在,并且您的代码不应允许将输入存储在数据库中。

dw1jzc5e

dw1jzc5e3#

我使用下面的查询解决了这个问题,它处理了上面提到的所有四种情况:

SELECT count(StartingNumber) FROM range
  WHERE 690  BETWEEN   StartingNumber and EndingNumber
    or 1800  BETWEEN   StartingNumber and EndingNumber
    or StartingNumber in ( SELECT StartingNumber
                            FROM range
                            WHERE StartingNumber BETWEEN 690 AND 1800);

相关问题