【问题标题】:SQL Selecting LIKE results and exact results with replace()SQL 使用 replace() 选择 LIKE 结果和精确结果
【发布时间】: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


【解决方案1】:

您的LIKE 不是问题所在。是大括号。当您编写 {$search} 时,这是因为您已将 PHP 变量注入到字符串中。但是对于str_replace,无论如何你都会破坏字符串,所以你不应该把它括起来。

这是你的新线路:

$sql = "SELECT * FROM teams WHERE name LIKE '%{$search}%' OR replace(name, ' ', '') LIKE '%".str_replace(' ', '', $search)."%' ORDER BY name ASC"

【讨论】:

  • 谢谢!将在允许的情况下选择您的答案正确。
【解决方案2】:

第二个不需要花括号。

$sql = "SELECT * FROM teams WHERE name LIKE '%{$search}%' OR replace(name, ' ', '') LIKE '%".str_replace(' ', '', $search)."%' ORDER BY name ASC";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    相关资源
    最近更新 更多