【问题标题】:MySQL - Adding a wildcard for 'any number of spaces' inside CONCAT?MySQL - 在 CONCAT 中为“任意数量的空格”添加通配符?
【发布时间】:2011-05-21 21:14:26
【问题描述】:

为什么这不起作用?

    SELECT up.first_name, up.last_name
    FROM user_profiles up 
    WHERE u.activated = 1
    AND up.first_name LIKE '%" . $search_term . "%'
    OR up.last_name LIKE '%" . $search_term . "%'
    OR CONCAT(up.first_name, '%', up.last_name) LIKE '%" . $search_term . "%'
    GROUP BY up.last_name
    ORDER BY up.last_name ASC;

当用户输入joe 时,我的自动完成返回joe smith。 当用户输入smith 我的自动完成返回joe smith

但是当用户输入 joe smith 我的自动完成返回空白。

我希望CONCAT 行能够在用户输入first_name [中间任意数量的空格] last_name 时返回结果。

我相信% 适用于任意数量的字符,但不适用于任意数量的空格。任何想法如何修复我的代码?

谢谢!

【问题讨论】:

    标签: mysql wildcard concat


    【解决方案1】:

    它不起作用,因为您在 $search_term 中寻找文字 %(以及名字和姓氏)

    替换此行:

    OR CONCAT(up.first_name, '%', up.last_name) LIKE '%" . $search_term . "%'
    

    用这一行:

    OR ('".$search_term."'  REGEXP CONCAT(up.first_name,[[:blank:]],up.lastname) ) 
    

    如果 first_name 和 last_name 不包含特殊的正则表达式字符,例如 $%^[] 等,这将起作用。

    看; http://dev.mysql.com/doc/refman/5.1/en/regexp.html
    请注意,正则表达式不适用于多字节字符集,请在匹配之前将其转换为 latin1。

    OR (CONVERT('".$search_term."' USING LATIN1) 
       REGEXP CONVERT(CONCAT(up.first_name,[[:blank:]],up.lastname) USING LATIN1) ) 
    

    【讨论】:

    • 感谢@johan - 不幸的是它不起作用,因为单个/多个空格可能在 inside $search_term--例如John%%%Smith - 你的行将允许对于 $search_term 之间的任何内容,例如 John Smith%%%%%%%%%%John Smith - 如果我错了,请纠正我! :)
    猜你喜欢
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多