首页 > 解决方案 > 如何在以`-`分隔的单列中将范围保存在DB中的范围之间查询`ranges`中的数据?

问题描述

我有下表ranges

id title range 
1  ABC   0-500
2  PQR   501-600
3  XYZ   601-700

PHP 代码

$range_input = "0-550";
$data = DB::select("Select * from ranges where range between $range_input");

预期输出:我预计id 1 and 2结果在 0-550 之间。

谢谢

标签: phpmysqllaravel

解决方案


您的表格设计不佳,范围的下限和上限应存储在单独的列中(稍后会详细介绍)。如果真的坚持当前的设计,您可以使用SUBSTRING_INDEX来分隔下限和上限:

SELECT *
FROM ranges
WHERE ? < SUBSTRING_INDEX(`range`, '-', -1) AND
      ? > SUBSTRING_INDEX(`range`, '-', 1)

对于?占位符,您可以绑定要搜索的范围值,例如0550

演示

对于您当前的设计,最好单独存储范围的下限值和上限值,即使用此版本的表:

id title lower upper
1  ABC   0     500
2  PQR   501   600
3  XYZ   601   700

现在您只需要以下简化查询:

SELECT *
FROM ranges
WHERE 0 < upper AND 550 > lower;

推荐阅读