表:文塔
+------------+---------------+------------+---------------+
| Zona | localidad | punto | direccion |
+------------+---------------+------------+---------------+
| Santiago | Quilicura | prueba1 | Casa Royal |
| Santiago | Tortal | test1 | Ferreteria |
| Valparaiso | Viña | asdf1 | Monitor |
|Osorno | Queso | qwerty | Listado |
+------------+---------------+------------+---------------+
我在mysql中有这个数据库,我正在使用php进行搜索引擎,这取决于搜索结果。
这必须承认逗号,例如,如果我搜索“Santiago,Quilicura”应该留下第一行所有信息“Santiago,Quilicura,prueba1,Casa Royal”
这是我的代码
$value = $_POST['search'];
$value = explode(",", $value);
$values = $value[0];
$valor = $value[1];
print_r($value);
print_r($valor);
if($values != "" and $valor == ""){
$query = mysql_query("SELECT zona, localidad, punto, direccion FROM venta WHERE zona LIKE '%$values%' or localidad LIKE '%$values%' or punto LIKE '%$values%' or direccion LIKE '%$values%' ");
}
if($values != "" and $valor != ""){
$query = mysql_query("SELECT zona, localidad, punto, direccion FROM venta WHERE zona LIKE '%$values%' or localidad LIKE '%$values%' or punto LIKE '%$values%' or direccion LIKE '%$values%' AND localidad LIKE '%$valor%' or punto LIKE '%$valor%' or direccion LIKE '%$valor%'");
}
<table>
<th>Zona</th>
<th>Localidad</th>
<th>Punto de venta</th>
<th>Direccion</th>
<?php
while($run = mysql_fetch_array($query)){
$zona = $run['zona'];
$localidad = $run['localidad'];
$punto = $run['punto'];
$direccion = $run['direccion'];
echo '<tr>';
echo '<td>'.$zona.'</td>';
echo '<td>'.$localidad.'</td>';
echo '<td>'.$punto.'</td>';
echo '<td>'.$direccion.'</td>';
echo '</tr>';
}?>
</table>
如果寻求“圣地亚哥,Quilicura”的所有结果都有“圣地亚哥”而没有指定“Quilicura”,那么我带来了什么
有人可以帮助我吗?
答案 0 :(得分:1)
我想我找到了一个非常好的解决方案:
$value = $_POST['search'];
$value = explode(",", $value);
foreach($value as $key=>$val) {
$value[$key] = trim($val);
}
$param = "'".implode("','",$value)."'"
$params = count($value);
if($params==0 || $params>4){
echo 'Wrong number of search parameters!';
} else {
$query = mysql_query("
SELECT `zona`, `localidad`, `punto`, `direccion` FROM (
SELECT `zona`, `localidad`, `punto`, `direccion`,
zona in ($param) as m1,
localidad in ($param) as m2,
punto in ($param) as m3,
direccion in ($param) as m4
FROM `venta`) AS v WHERE v.m1+v.m2+v.m3+v.m4>=$params
");
}
并尝试使用PDO和bind_param而不是mysql直接查询
答案 1 :(得分:1)
您可能希望使用布尔全文搜索来进行此类查询。
这将采取这样的查询:
SELECT zona, localidad, punto, direccion
FROM venta
WHERE MATCH (zona, localidad, punto, direccion)
AGAINST ('keyword1 keyword2 [...]' IN BOOLEAN MODE);
有关全文搜索的更多信息,请查看此链接 - http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html
首先会向您返回最相关匹配的匹配列表。
答案 2 :(得分:0)
我认为你需要写一些东西,看看列表中是否有东西:
SELECT zona, localidad, punto, direccion FROM venta
WHERE
zona IN ('Santiago', 'Quilicura') or
localidad IN ('Santiago', 'Quilicura') or
punto IN ('Santiago', 'Quilicura') or
direccion ('Santiago', 'Quilicura')
这就是你的查询的样子 - 关键是将$ _POST [&#39;]&#39;]字符串转换为看起来像sql查询中的数组的东西。
这意味着,无论用户输入搜索类别的顺序如何,您都可以找到匹配项。 OR确保即使用户只输入zona,localidad,punto或direccion中的一个,您仍然可以获得匹配。
所以在php中你必须做这样的事情:
$words = explode(",", $_POST['search']);
$sql_array = "('".$words[0]."'";
for($i=1;$i<count($words);$i++){
$sql_array .= ",'".$words[$i]."'";
}
$sql_array .= ")";
$sql = "SELECT zona, localidad, punto, direccion FROM venta WHERE zona IN $sql_array or localidad IN $sql_array or punto IN $sql_array or direccion IN $sql_array";
}
好的,经过一些讨论,我建议尝试加入:
SELECT * FROM venta
JOIN
(SELECT * FROM venta WHERE zona IN ('Santiago','Quilicura')) zonas ON zonas.zona = venta.zona
WHERE
venta.localidad IN ('Santiago','Quilicura')