代码之家  ›  专栏  ›  技术社区  ›  AJB

mysql有问题:concat_ws('',name_first,name_middle,name_last)像'%keyword%'

  •  2
  • AJB  · 技术社区  · 14 年前

    嘿,伙计们,我正在设置一个跨多个字段的关键字搜索: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"
    

    所以,如果我在数据库里有三个名字:

    亚伦J班
    亚伦·J·坎
    鲍勃劳布

    如果用户的关键词是“bob lawblaw”,我就没有结果。如果user_keyword=“bob l”,则返回bob l lawblaw。显然,我不能强迫人们在他们的关键字搜索中包含中间名,但我坚持正确的方式来做这件事。

    非常感谢大家的帮助。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Lizard    14 年前

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

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

    ##更新##

    如果使用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;