【问题标题】:MySQL - Is it possible to use LIKE on all columns in a table?MySQL - 是否可以在表中的所有列上使用 LIKE?
【发布时间】:2013-08-24 06:47:20
【问题描述】:

我正在尝试制作一个简单的搜索栏,可以在我的数据库中搜索某些单词。可以在不使用 WHERE 的情况下使用 LIKE 属性吗?我希望它在所有列中搜索关键字,而不仅仅是一个。目前我有这个:

mysql_query("SELECT * FROM shoutbox WHERE name LIKE '%$search%' ")

这显然只使用搜索输入搜索名称。这两个我都试过了:

mysql_query("SELECT * FROM shoutbox LIKE '%$search%' ")
mysql_query("SELECT * FROM shoutbox WHERE * LIKE '%$search%' ")

两者都不起作用。这是可能的事情还是有其他方法可以解决?

【问题讨论】:

    标签: mysql where sql-like


    【解决方案1】:

    没有捷径。您需要分别指定每一列。

    SELECT * FROM shoutbox 
        WHERE name LIKE '%$search%' 
            OR foo LIKE '%$search%' 
            OR bar LIKE '%$search%'  
            OR baz LIKE '%$search%' 
    

    【讨论】:

    • 我以前不知道“OR”。这应该可以完美地工作。我很感激
    • 嘿@skv,你能解释一下“match()”和“LIKE + OR”之间的性能比较吗?
    • 对不起,我不明白您的问题,如果这是一个特定的查询,请将其作为问题发布,以便我或其他人可以回复
    【解决方案2】:

    一种选择是使用CONCAT 将列粘合到一个字符串中。

    SELECT * FROM shoutbox 
    WHERE CONCAT(name, foo, bar, baz) LIKE '%$search%' 
    

    但是,由于列粘在一起而没有间距,这种方法有时会产生误报。您可以通过添加某种间距 (' ')、分隔符 ('-') 或空字节字符 ("\0") 来缓解该问题,您知道这些字符不会出现在您的搜索词中。

    例如,如果搜索词不包含任何空格,那么您可以只用空格分隔列:

    SELECT * FROM shoutbox 
    WHERE CONCAT(name, ' ', foo, ' ', bar, ' ', baz) LIKE '%$search%'
    

    然而,如果搜索词确实包含空格,那么空字节会更好:

    SELECT * FROM shoutbox 
    WHERE CONCAT(name, "\0", foo, "\0", bar, "\0", baz) LIKE '%$search term%'
    

    【讨论】:

    • 只是为了澄清以防有人错过笑脸:这是一个笑话答案。它会匹配误报并且连接列非常慢。
    • 这不是一个玩笑......但你是对的,它可能匹配误报,并且可能更慢......无论如何它适用于大多数小型请求。取决于您正在搜索的内容以及列中的数据,以选择此“快捷方式”是否可以接受;)
    【解决方案3】:

    您可能还想查看 MATCH() 函数,例如:

    SELECT * FROM shoutbox 
    WHERE MATCH(`name`, `foo`, `bar`) AGAINST ('$search')
    

    您还可以为此添加布尔模式:

    SELECT * FROM shoutbox 
    WHERE MATCH(`name`, `foo`, `bar`) AGAINST ('$search') IN BOOLEAN MODE
    

    您还可以获取相关性分数并添加 FULLTEXT 键以加快查询速度。

    【讨论】:

    【解决方案4】:

    这将不再显示重复的行。

    SELECT * FROM shoutbox 
    WHERE (name LIKE '%$search%' 
        OR foo LIKE '%$search%' 
        OR bar LIKE '%$search%'  
        OR baz LIKE '%$search%') 
    

    【讨论】:

      猜你喜欢
      • 2013-06-11
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      相关资源
      最近更新 更多