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

在WHERE子句中使用mysql concat()?

  •  39
  • kevtrout  · 技术社区  · 16 年前

        select * from table where first_name like '%$search_term%' or 
        last_name like '%$search_term%';
    

    这适用于单词搜索词,但结果集包括名为“Larry”的所有人。但如果有人先输入名字,然后输入空格,然后输入姓氏,我希望搜索结果更窄。我试过下列方法,但没有成功。

        select * from table where first_name like '%$search_term%' or last_name 
        like '%$search_term%' or concat_ws(' ',first_name,last_name) 
        like '%$search_term%';
    

    有什么建议吗?

    编辑: 我测试的名字是“拉里·史密斯”。db将“Larry”存储在“first_name”列中,“Smith”存储在“last_name”列中。数据是干净的,没有多余的空格,搜索词被左右修剪。

    编辑2: 今天早上我试过罗伯特·甘博的答案。他的跑步与我昨晚跑步的非常相似。我无法解释,但今天早上它起作用了。我能想到的唯一区别是,昨晚我运行了concat函数作为搜索查询的第三个“或”段(在查看了first_name和last_name之后)。今天早上,我在浏览了上面的内容以及地址和企业名称之后,将其作为最后一部分进行了运行。

    在查询结束时运行MySQL函数是否比中间操作更好?

    7 回复  |  直到 16 年前
        1
  •  95
  •   Robert Gamble    16 年前

    您所拥有的应该有效,但可以简化为:

    select * from table where concat_ws(' ',first_name,last_name) 
    like '%$search_term%';
    

    您能否提供一个示例名称和搜索词,但这不起作用?

        2
  •  13
  •   Community CDub    8 年前

    请注意,搜索查询现在区分大小写。

    使用时

    SELECT * FROM table WHERE `first_name` LIKE '%$search_term%'
    

    它将同时匹配“拉里”和“拉里”。有了这个concat_ws,它会突然变得区分大小写!

    可通过使用以下查询解决此问题:

    SELECT * FROM table WHERE UPPER(CONCAT_WS(' ', `first_name`, `last_name`) LIKE UPPER('%$search_term%')
    

    编辑:请注意,这仅适用于非二进制元素。另见 mynameispaulie's answer .

        3
  •  5
  •   Jack    16 年前
    SELECT *,concat_ws(' ',first_name,last_name) AS whole_name FROM users HAVING whole_name LIKE '%$search_term%'
    

    …可能是你想要的。

        4
  •  4
  •   mynameispaulie    12 年前

    致Luc:

    我同意你的回答,不过我想补充一点,UPPER只适用于非二进制元素。如果使用的是年龄列(或任何数字),则需要执行强制转换以使上限函数正常工作。

    SELECT * FROM table WHERE UPPER(CONCAT_WS(' ', first_name, last_name, CAST(age AS CHAR)) LIKE UPPER('%$search_term%');
    

    请原谅我没有直接回应Luc的回答,但我的一生都不知道该怎么做。如果管理员可以移动我的帖子,请这样做。

        5
  •  2
  •   Taryn Frank Pearson    13 年前

    您可以这样做(在mysql中工作),也可以使用其他SQL。。 试试这个:

    select * from table where concat(' ',first_name,last_name) 
        like '%$search_term%';
    
        6
  •  1
  •   benlumley    16 年前

    有几件事可能会妨碍你——你的数据干净吗?

    这可能是因为名字字段的末尾有空格,这意味着当你对名字和姓氏进行编码时,名字和姓氏之间有两个空格?使用trim(first_name)/trim(last_name)可以解决这个问题,尽管真正的解决方法是更新数据。

    您也可以将这一点与两个单词同时出现但不一定同时出现的位置相匹配(假设您使用的是php,$search\u term变量表明您使用的是php)

    $whereclauses=array();
    $terms = explode(' ', $search_term);
    foreach ($terms as $term) {
        $term = mysql_real_escape_string($term);
        $whereclauses[] = "CONCAT(first_name, ' ', last_name) LIKE '%$term%'";
    }
    $sql = "select * from table where";
    $sql .= implode(' and ', $whereclauses);
    
        7
  •  -2
  •   ScottJShea bdub13    10 年前

    您可以尝试以下方法:

    select * FROM table where (concat(first_name, ' ', last_name)) = $search_term;