1

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

这是我所拥有的:

$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”,我什么也得不到。

我觉得我错过了通配符的意义,或者没有正确使用它们。有人可以向我解释一下并更正我的查询..

谢谢

4

3 回答 3

4

引入通配符来表示“任意数量的任意字符”(在 的情况下%)。

所以

col LIKE '%foo'

将匹配foo价值和barfoo价值。

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

CONCAT(first_name, ' ', last_name) = 'foo bar'
于 2013-02-23T08:09:46.367 回答
2

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

您遇到的问题是您正在搜索Lindsayor 或Thompsonfor %Lindsay Thompson,即在任一名称中搜索任意数量的字符,后跟全名。因此这永远不会匹配。

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

SELECT * from customers WHERE CONCAT(first_name1, ' ', last_name1) LIKE '%" .mysql_real_escape_string($_GET['custname']). "%' AND status= 'active' LIMIT 6";

于 2013-02-23T08:13:24.913 回答
-1

试试这个,希望对你有帮助

 $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"; 
于 2013-02-23T08:20:56.987 回答