我有一个搜索表单,我可以按名称搜索:
if($v=$_POST['Name']){
$sql.=" AND CONCAT(' ',Name) LIKE '% $v%'";
}
if($v=$_POST['PriceU']){
$sql.=" AND Price BETWEEN '$_POST[PriceF]' AND '$_POST[PriceU]'";
}
if($v=$_POST['RateU']) {
$sql.=" AND Rate BETWEEN '$_POST[RateF]' AND '$_POST[RateU]'";
}
if($v=$_POST['Cat']) {
$sql.=" AND Category='$_POST[Cat]' ";
}
$resm=mysql_query ("SELECT * from members WHERE Level='$_GET[level]' $sql Order By Name");
只是理解,我回应了'$ resm'。当我使用名称Toyota搜索时,这是生成的查询:
SELECT * FROM members
WHERE Level='2' AND
CONCAT(' ',Name) LIKE '% Toyota%'
ORDER BY Name.
我的问题是CONCAT(' ',Name)
在这里有什么用?我认为即使没有CONCAT
它也应该有用。那是
if($v=$_POST['Name']){
$sql.=" AND (' ',Name) LIKE '% $v%'";
然后生成的SQL是
SELECT * from members WHERE Level='2' AND Name LIKE '% Toyota%' Order By Name
但这不输出任何东西。这是为什么?这个查询出了什么问题,CONCAT
有什么影响?
答案 0 :(得分:4)
CONCAT(' ', Name)
为列值预先添加空格。与
LIKE '% Toyota%'
这可以防止在单词的中间找到 Toyota ,但允许在字段的开头找到它。
答案 1 :(得分:0)
CONCAT()
接受两个或多个字符串作为参数,并通过将它们相互追加来组合它们。例如,CONCAT('hel', 'lo')
会返回hello
。您正在做的是检查Name
列是否与关键字匹配,如果它们都以空格为前缀。目前还不清楚为什么,但我的猜测是试图阻止匹配单词的一部分,例如匹配Kia
和Nokia
。这种方法确实存在缺陷,因为它仍会匹配带有额外字母的字词 - 搜索Audi
会返回Audioslave
等等。