繁体   English   中英

在 mySQL 中使用 LIKE 匹配任何内容

[英]Match anything using LIKE in mySQL

我正在制作一个搜索引擎,我需要做一个查询,从一个包含用户的表的四列中查找匹配的数据:名称、第二个名字、姓氏和第二个姓氏,所以如果我用这样的查询:

"SELECT * FROM table_users WHERE name LIKE '%".$searchTerm."' OR last_name LIKE '%".$searchTerm."' OR second_name LIKE '%".$searchTerm."' OR second_last_name LIKE '%".$searchTerm."'

以包含此数据行的表为例:

name: Joe;
lastname:Doe;
second_name:Jordan;
second_lastname: Doeman; 

搜索 Joe、Doe、Jordan 或 Doeman 会从这个 Joe 行获得我的结果,但是一起搜索 Joe Doe 不会给我任何结果,因为当我点击Doe 的第一个 D,所以我的问题是,有没有办法使用 %term% 之类的东西来影响这一行,但不是从这里到这里,而是以某种方式“在”内,所以像 Joe Doe 这样的术语仍然给我结果乔排是因为乔中的乔。 (乔过量 XDD)

我正在使用 php 和 MySQL 仅供参考。

你好。

您需要拆分搜索字符串,并为每个单词使用单独的LIKE 所以如果搜索字符串是Joe Doe ,它应该是

WHERE name LIKE '%Joe%' OR name LIKE '%Doe%' OR lastname LIKE '%Joe%' OR lastname LIKE '%Doe%' ...

您可以像这样动态生成它:

$words = explode(' ', $searchTerm);
$tests = array();
foreach($words as $w) {
    $tests[] = "name LIKE '%$w%' OR lastname LIKE '%$w%' OR second_name LIKE '%$w%' OR second_lastname LIKE '%$w%'";
}
$test_string = implode(' OR ', $tests);
$sql = "SELECT * FROM table_users WHERE $test_string";

您正在寻找的是CONCAT_WS()

所以而不是:

"SELECT * FROM table_users WHERE name LIKE '%".$searchTerm."' OR last_name LIKE '%".$searchTerm."' OR second_name LIKE '%".$searchTerm."' OR second_last_name LIKE '%".$searchTerm."'

尝试:

"SELECT * FROM table_users WHERE concat_ws(' ',first_name,last_name) 
'%".$searchTerm."%';"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM