是的,我正在为我们的某个应用程序开发一个位置搜索元素,但我被卡住了。
我们的数据库中有四行不同的行。地址,城市,州和ZIP。因此,当用户添加地址时,它将使用这些行中的一个,两个,一个或四个进行搜索。
即
搜索1: Fratton Road,Portsmouth,Endland,PO1 3NP
搜索2:英格兰
搜索3:英国利物浦
我们目前将搜索词分为四个元素,与上述相同,分别是$ address,$ city,$ state,$ zip。
因此,搜索所有四个变量的值的简单查询是:
$stmt = $conn->prepare("SELECT id FROM activity WHERE (address=?) AND (city=?) AND (state=?) AND (zip=?)");
$stmt->bind_param("s", $array['address'], $array['city'], $array['state'], $array['zip']);
$stmt->execute();
但是,如果他们都没有价值,我该怎么办?如果搜索词只是英格兰或利物浦英格兰怎么办? ZIP和地址行没有值,因此导致错误。
我应该对四个元素中的每一个进行查询。获取地址,城市,州和邮编的ID,然后删除任何重复项?或者有更好的方法吗?
欢呼阅读。
答案 0 :(得分:0)
我过去使用的一种方法是有条件地使用where子句......类似于
where ( addressparm = '' OR table.address = addressParm )
AND ( cityparm = '' or table.city = cityparm )
AND ( stateparm = '' or table.state = stateparm )
然后你的查询保持不变,并且会忽略没有提供值的那些,但正如tadman所说,由于你是动态构建你的查询,你可能只是添加它们可用。
答案 1 :(得分:0)
如果列是varchars
,请使用它SELECT id FROM activity WHERE (address like '%?%') AND (city like '%?%') AND (state like '%?%') AND (zip like '%?%')
如果值存在,那么另外它应该用通配符%
来实现答案 2 :(得分:0)
在基本SQL中,您可以使用NVL功能 在这里查看定义:mysql.com forum
但是,只有在SQL中有变量的情况下(但我认为,这在这里不起作用)
此方法的示例:
SELECT id FROM table_a WHERE column_x = NVL(VARIABLE, column_x)
如果在SQL中使用它并且VARIABLE将为NULL,则将返回所有行。
但是,我认为,更好的方法是使用php来创建你想要的语句 例如:
$stmt = $conn->prepare("SELECT id FROM activity WHERE 1=1"
. ((trim($array['address'])==='')?" AND address='" . $array['address'] . "'":"")
. ((trim($array['city'])==='')?" AND city='" . $array['city'] . "'":"")
. ((trim($array['state'])==='')?" AND state='" . $array['state'] . "'":"")
. ((trim($array['zip'])==='')?" AND zip='" . $array['zip'] . "'":"")
);
不要忘记在字符串周围单引号。 ;)
答案 3 :(得分:0)
根据tadman的建议,有条件地添加查询。由于涉及写作的条件数量,希望有不同的方法来做到这一点。感谢所有的回复。