19

我正在尝试制作一个简单的搜索栏,可以在我的数据库中搜索某些单词。可以在不使用 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%' ")

都没有工作。这是可能的事情还是有其他方法可以解决?

4

4 回答 4

17

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

SELECT * FROM shoutbox 
    WHERE name LIKE '%$search%' 
        OR foo LIKE '%$search%' 
        OR bar LIKE '%$search%'  
        OR baz LIKE '%$search%' 
于 2013-08-24T06:50:17.703 回答
9

您可能还想查看 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 键以加快查询速度。

于 2013-08-24T07:54:57.717 回答
8

一种选择是使用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%'
于 2018-03-27T12:54:11.840 回答
3

这将不再显示重复的行。

SELECT * FROM shoutbox 
WHERE (name LIKE '%$search%' 
    OR foo LIKE '%$search%' 
    OR bar LIKE '%$search%'  
    OR baz LIKE '%$search%') 
于 2015-10-28T15:50:22.117 回答