MySQL的麻烦:CONCAT_WS('',name_first,name_middle,name_last)就像'%keyword%'

时间:2010-06-14 13:47:21

标签: php mysql

嘿伙计们,我在多个字段中设置关键字搜索:name_first,name_middle,name_last但是我没有得到我想要的结果。这是查询:

    "SELECT accounts_users.user_ID, users.name_first, users.name_middle, users.name_last, users.company
   FROM accounts_users, users
   WHERE accounts_users.account_ID = '$account_ID' AND accounts_users.user_ID = users.id AND CONCAT_WS(' ', users.name_first, users.name_middle, users.name_last) LIKE '$user_keyword%'
   ORDER BY users.name_first ASC"

所以,如果我在DB中有三个名字:

Aaron J Ban
Aaron J Can
Bob L Lawblaw

如果user_keyword ==“bob lawblaw”,我没有结果。如果user_keyword ==“bob L”则返回Bob L Lawblaw。显然,我不能强迫人们在他们的关键词搜索中包含这些人的中间名,但我仍然坚持正确的方法来做到这一点。

非常感谢所有帮助。

1 个答案:

答案 0 :(得分:1)

可能会考虑在这3列上创建一个全文索引,然后对其进行全文搜索。

http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html

<强> ## UPDATE ##

如果使用INNODB,那么可以在字符串上使用php的split函数;

$myVars = split(" ",$user_keyword);

然后为每个单词添加一个select语句(我也会在select语句中使用concat,所以你不必为每个where语句重新设置它)

$extraSQL = '';
foreach($myVars as $search) {
    $extraSQL .= " AND `my_concat` LIKE '%".$search."%'";
}

SELECT 
    `your_fields`, 
    CONCAT_WS(' ', users.name_first, users.name_middle, users.name_last) as `my_concat` 
FROM `your_tables`
WHERE `accounts_users`.account_ID = '$account_ID' . $extraSQL;