【发布时间】:2015-08-28 17:40:45
【问题描述】:
对不起,如果标题不是很具有描述性,我真的不知道如何简短地用这个词。在我的网站上,我有一个充满视频游戏和电子竞技团队的数据库表。当我在 URL 中显示团队名称时,我会删除其中的所有空格。出于这个原因,我需要在搜索时接受名称的无空格版本,以防有人尝试输入他们在 URL 中找到的名称。
球队名称示例:洛圣都国王队
网址示例:mysite.com/teams/LosSantosKings
示例搜索查询 #1:“Los San”(不带引号)
示例搜索结果 #1:洛圣都国王队
示例搜索查询 #2:“LosSan”(不带引号)
示例搜索结果 #1:空 - 返回 0 行
如果您搜索“Los San”,则会返回团队的数据库行。但是,如果您搜索“LosSan”,则不会。这种使用 SQL 的 replace() 函数的方法在我测试它的精确匹配时工作正常,但是当设置在 LIKE 查询旁边时,它在后一种情况下不起作用。
这是我的查询:
$sql = "SELECT * FROM teams WHERE name LIKE '%{$search}%' OR replace(name, ' ', '') LIKE '%{".str_replace(' ', '', $search)."}%' ORDER BY name ASC"
这是一个语法错误,还是我需要以另一种方式解决这个问题,可能需要对团队名称进行 2 个单独的查询/检查?
【问题讨论】:
-
“这是语法错误”,是不是给你报错了?
-
不,它没有给我任何错误。这就是我在这里问的原因。我所说的语法是指在同一个查询中是否允许使用 LIKE 和 = 语句。
-
只要逻辑正确,
LIKE和=可以任意组合使用。但在您的逻辑中,您在列名上使用了replace函数。您确定在查询时知道列名吗? -
你熟悉mysql replace()吗?它不会替换列名中的内容,而是替换列值中的内容。无论如何,谢谢,我猜?你试过了,有点。
-
对不起,我误解了你的问题。我认为您的查询的编写方式没有问题;它应该给你你正在寻找的东西。但是,你真的不需要第一个
name LIKE '%{$search}%',因为如果它通过了OR之后的所有内容,它也应该通过第一部分(也就是说,它是多余的)。
标签: php mysql sql-server