【问题标题】:Mysql INSTR help search only 1 row that match more textMysql INSTR 帮助仅搜索匹配更多文本的 1 行
【发布时间】:2020-02-03 08:34:35
【问题描述】:
我有一个带域代码的桌子
code
BED 6
BED 6 DEM
我有一个要搜索的文本,例如“... BED 6 DEM ...”
如果我这样做SELECT * FROM room WHERE INSTR('... BED 6 DEM ...',code) >0
我得到了这两行:
code
BED 6
BED 6 DEM
但我只想得到 1 个:BED 6 DEM
有时我只需要SELECT * FROM room WHERE INSTR('... BED 6 ...',code) >0
只得到 1 行
code
BED 6
没问题
有什么建议可以始终获得最佳匹配行吗?
【问题讨论】:
标签:
mysql
string
sql-order-by
where-clause
sql-limit
【解决方案1】:
您可以按照匹配字符串的长度降序对结果进行排序,只得到第一个结果:
SELECT *
FROM room r
WHERE INSTR('... BED 6 DEM ...', code) > 0
ORDER BY CHAR_LENGTH(code) DESC
LIMIT 1
另一种选择是使用带有相关子查询的NOT EXISTS 条件来匹配包含搜索字符串的最长字符串,例如:
SELECT *
FROM room r
WHERE INSTR('... BED 6 DEM ...', code) > 0
AND NOT EXISTS (
SELECT 1
FROM room r1
WHERE
INSTR('... BED 6 DEM ...', r1.code) > 0
AND CHAR_LENGTH(r1.code) > CHAR_LENGTH(r.code)
)