MySQL LIKE运营商&通配符

时间:2013-02-23 07:56:33

标签: php mysql database wildcard sql-like

我一直在阅读教程,并没有学到任何新东西。我有一张顾客表。客户的名字和姓氏存储在单独的列中。我想编写一个可以按名称搜索客户的查询,无论是第一个,最后一个还是两个。

这就是我所拥有的:

$queryyy = "
    SELECT *
    FROM `customers`
    WHERE
        `first_name1` LIKE '".mysql_real_escape_string($_GET['custname'])."%'
        OR `last_name1` LIKE '%".mysql_real_escape_string($_GET['custname'])."'
        AND `status` = 'active'
    LIMIT 6
"; 

如果我想找到“Lindsay Thompson”,我可以查询“lindsay”或“Thompson”并获得我想要的结果,但如果我查询“lindsay thompson”,我什么也得不到。

我觉得我错过了通配符的要点,或者没有正确使用它们。有人可以向我解释一下并纠正我的疑问..

由于

3 个答案:

答案 0 :(得分:4)

引入通配符来表达“任意数量的任何字符”(如果是%)。

所以

col LIKE '%foo'

将匹配foo值和barfoo值。

你想要的实际上是相反的 - 你需要连接两列并检查它是否等于请求,如:

CONCAT(first_name, ' ', last_name) = 'foo bar'

答案 1 :(得分:2)

%通配符将与任意数量的字符匹配。要使用页面http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html中显示的示例 D%i%将与David匹配。

您遇到的问题是,您正在LindsayThompson搜索%Lindsay Thompson,即搜索任意名称后面的任意数字字符,然后搜索全名。因此,这永远不会匹配。

一种选择是对两个名称的链接字符串运行查询。

  

来自客户的SELECT * WHERE CONCAT(first_name1,'',last_name1)LIKE'%“。mysql_real_escape_string($ _ GET ['custname'])。”%'和status ='有效'LIMIT 6“;

答案 2 :(得分:0)

试试这个,希望它能帮到你

 $queryyy = "SELECT * FROM `customers`
             WHERE (`first_name1` LIKE '".mysql_real_escape_string($_GET['custname'])."%' 
             OR `last_name1` LIKE '%".mysql_real_escape_string($_GET['custname'])."') 
             or concat(`first_name1`,' ',last_name1`) 
             LIKE'".mysql_real_escape_string($_GET['custname'])."%' 
             AND `status` = 'active' LIMIT 6";