我有一个文本输入,在键盘上我想要更新相邻选择字段中的选项。
我的数据库中有这两个表:
型号:
ID modelName brandID
1 NA140 3
1 SRL 1
1 SRS 1
1 SRF 1
1 SMS 2
1 SMU 2
品牌:
ID brandName
1 Samsung
2 Bosch
3 Panasonic
在选择字段中,我想列出品牌表中的所有brandNames
,但列出它们与文字输入的相关性。
因此,如果键入“SR”,modelNames
的顺序将是SRF,SRL,SRS,SMU,SMS,NA140,然后相应的brandName
作为结果被抓取,但仅列出每个品牌一次。
我该如何撰写此查询?
我有这个基本想法,我认为这就是我需要的......
JOIN models & brands ON m.brandID = b.ID
MATCH modelName to string%
SELECT UNIQUE brandName
答案 0 :(得分:0)
我能想到的唯一方法是首先选择匹配用户输入的位置,得到那些结果,然后再做它的位置,然后将结果与联合组合,如下所示:
(SELECT `t1`.`modelName`, `t1`.`brandID`,`t2`.`brandName` FROM `Models` as `t1` INNER JOIN `Brands` AS `t2` ON `t1`.`brandID`=`t2`.`ID` WHERE `t1`.`modelName` LIKE 'SR%' ORDER BY `t1`.`modelName`,`t2`.`brandName`)
UNION
(SELECT `t1`.`modelName`, `t1`.`brandID`,`t2`.`brandName` FROM `Models` as `t1` INNER JOIN `Brands` AS `t2` ON `t1`.`brandID`=`t2`.`ID` WHERE `t1`.`modelName` NOT LIKE 'SR%' ORDER BY `t1`.`modelName`,`t2`.`brandName`)
可能有一种更有效的方法可以做到这一点,这是我在去商店之前想到的:)
答案 1 :(得分:0)
你在找这样的东西吗?
SELECT DISTINCT brandname
FROM models m JOIN brands b
ON m.brandid = b.id
ORDER BY modelname LIKE 'S%' DESC,
modelname LIKE 'SR%' DESC,
modelname
输出:
| BRANDNAME | |-----------| | Samsung | | Bosch | | Panasonic |
这是 SQLFiddle 演示
更新:对于SMU%
输入字符串,查询应该是
SELECT DISTINCT brandname
FROM models m JOIN brands b
ON m.brandid = b.id
ORDER BY modelname LIKE 'S%' DESC,
modelname LIKE 'SM%' DESC,
modelname LIKE 'SMU%' DESC,
modelname
输出:
| BRANDNAME | |-----------| | Bosch | | Samsung | | Panasonic |
这是 SQLFiddle 演示
答案 2 :(得分:0)
我提出了类似的查询(简化):
select brandName from (
select b.brandName as brandName, m.modelName
from brands b join models m
on m.brandid = b.id
where m.modelName like '%sr%'
union
select b.brandName as brandName, m.modelName
from brands b join models m
on m.brandid = b.id
where m.modelName not like '%sr%') as curb
group by brandName
SQLfiddle:http://sqlfiddle.com/#!2/593b36/30
(不完全是品牌和型号的命名)
答案 3 :(得分:0)
select distinct brandName
from Models m inner join Brands b
on m.brandID = b.ID
where m.modelName like 's%'
<强> Fiddle 强>
答案 4 :(得分:0)
SELECT DISTINCT b.brandName
FROM brands b
JOIN models m
ON m.brandID = b.id
WHERE m.modelName LIKE '%$variable%'
UNION
SELECT b.brandName
FROM brands b
JOIN models m
ON m.brandID = b.id
WHERE m.modelName NOT LIKE '%$variable%'
答案 5 :(得分:0)
我们需要的是一个函数来计算字段中的值,锚点和表格中的值之间的距离,这个函数可以是锚点HEX
和{{1}之间的差值。表值的。
HEX
在将值传递给SELECT m.id, modelName, brandName
FROM Model m
INNER JOIN Brand b ON m.brandID = b.ID
ORDER BY ABS(CONV(HEX(RPAD('SR', 5, ' ')), 16, 10)
- CONV(HEX(RPAD(modelName, 5, ' ')), 16, 10))
之前,要获得正确的结果,需要填充字符串以使它们都具有相同的长度,这就是HEX
的原因。
要计算差值,将值从base-16转换为base-10,因为距离仅为正RPAD
。
如果名称长度超过5个字符的模型,ABS
的参数需要修改为最长模型的长度。
答案 6 :(得分:0)
我相信解决方案不应该出现在查询部分......至少对于每个输入的字母都是如此。也许你可以对第一个字母进行一次查询,将该字母的数据检索到客户端部分,将名称放在数组中,然后在客户端进行排序。 在服务器端执行此操作显然较慢,但是对每个键入的字母进行查询,考虑到用户键入错误字母的次数,删除(将进行新查询)和再次键入(新查询),这很糟糕表现条款。 将计算放在客户端更好。只有在第一个字母被删除并键入新字母时,您才可以重做查询。 可能你需要一些为什么每次都要进行新的查询,但是......也许是一种不同的方法可以帮助我找到更好的解决方案......