我有桌子,因为我有一个带破折号值的字段。像...
我需要在条件之间进行搜索。
例如,如果我有一个值25,那么我需要搜索包含值25的记录,如20-31。在上面的图像中有6个记录,其中包括25个值。所以它应该返回6条记录。
请在此查询中帮助我?对此有什么疑问?
答案 0 :(得分:4)
您可以使用MySQL的substring_index()功能轻松获取短划线之前和之后的数据:
select substring_index(yourcolumn,'-',1) as `lower`, substring_index(yourcolumn,'-',-1) as `upper`
from yourtable
这样,您可以返回特定值介于以下范围内的记录:
select * from yourtable
where 25 between substring_index(yourcolumn,'-',1) + 0 and substring_index(yourcolumn,'-',-1) + 0
+ 0
迫使MySQL在比较前将substring_index()
的结果转换为数值。
答案 1 :(得分:1)
您可以使用SUBSTRING_INDEX
使用以下解决方案:
SELECT *
FROM table_name
WHERE 25 >= CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(column_name, '-', 1), '-', -1), UNSIGNED INTEGER)
AND 25 <= CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(column_name, '-', 2), '-', -1), UNSIGNED INTEGER)
-- or
SELECT *
FROM table_name
WHERE 25 BETWEEN CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(column_name, '-', 1), '-', -1), UNSIGNED INTEGER)
AND CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(column_name, '-', 2), '-', -1), UNSIGNED INTEGER)
我建议你改变你的桌面设计。我会使用VARCHAR
数据类型使用INTEGER
数据类型将列拆分为两列。您可以使用以下ALTER TABLE
命令添加两个新列:
ALTER TABLE table_name ADD colNameA INT;
ALTER TABLE table_name ADD colNameB INT;
要拆分当前列的值并将值更新为新列,可以使用以下UPDATE
命令:
UPDATE table_name SET
colNameA = CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(column_name, '-', 1), '-', -1), UNSIGNED INTEGER),
colNameB = CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(column_name, '-', 2), '-', -1), UNSIGNED INTEGER)
最后,您可以使用此VARCHAR
命令删除ALTER TABLE
列:
ALTER TABLE table_name DROP COLUMN col_name
现在,您可以使用以下(简单)查询来获得预期结果:
SELECT *
FROM table_name
WHERE 25 >= colNameA AND 25 <= colNameB
-- or
SELECT *
FROM table_name
WHERE 25 BETWEEN colNameA AND colNameB
答案 2 :(得分:0)
如果要获取介于 35 和 39 之间的值,则可以使用以下查询,
SELECT
*
FROM
yourtable
WHERE
35 && 39
BETWEEN SUBSTRING_INDEX(tablecolumn, '-', 1) + 0 AND
SUBSTRING_INDEX(tablecolumn, '-', - 1) + 0
答案 3 :(得分:-2)
我不知道如何使用MySQL
。
但是使用php
可以检查范围。
例如
// First of all get all record from database.
$search = 10; // Your searching value.
// Loop all rows.
while($rows = mysqli_fetch_array($r)){
$explode = explode("-",$rows['dash']); // For get from-to value.
$range = isset($explode[0])&&isset($explode[1])?range($explode[0],($explode[1]-1)):array(); // For get range.
if(in_array($search,$range)){ // For check searching value is exist or not !
echo "Yes ! I get into ".$rows['dash']; // Do stuff.
}
}
注意:如果是10-15则会检查10,11,12,13,14。
答案 4 :(得分:-2)
根据我的意见,如果您不想更改表格结构,那么
根据您的其他条件获取记录,然后从该数据中使用foreach循环检查该字段之间的数量并爆炸。像
如果你有$ data作为所有数据
foreach($data as $value){
$new_val=explode(',',$value['new_field']);
if(25 >= $new_val[0] && 25 <= $new_val[1]){
// here create new array
}
}