我一直在阅读教程,并没有学到任何新东西。我有一张顾客表。客户的名字和姓氏存储在单独的列中。我想编写一个可以按名称搜索客户的查询,无论是第一个,最后一个还是两个。
这就是我所拥有的:
$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”,我什么也得不到。
我觉得我错过了通配符的要点,或者没有正确使用它们。有人可以向我解释一下并纠正我的疑问..
由于
答案 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
匹配。
您遇到的问题是,您正在Lindsay
或Thompson
搜索%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";