【问题标题】:MySQL search with multiple values and multiple tablesMySQL搜索具有多个值和多个表
【发布时间】:2014-12-17 18:29:16
【问题描述】:

我想制作一个搜索引擎,任何人都可以在某个地方搜索服务并获得结果,例如有人输入“restaurants @LA”,结果显示了洛杉矶的所有餐厅。

我有两张桌子保存餐厅名称,另一张桌子保存它们与 id 相关的位置。在我的 SQL 中,我使用的是 LEFT JOIN,但我真的很难编写 SQL 查询来解决这个问题。

public function sec($searchwords){
$searchwords=trim($searchwords);

$searchwords=preg_split('/[\s]+/',$searchwords);


//after removing whitespaces covert d array back to string
$searchwordz=false;
foreach($searchwords as $searchword){
$searchwordz .= $searchword;
}


//separate d strings from location
$location=false;
preg_match("/@[a-zA-Z0-9]+/", $searchwordz, $matches);
foreach($matches as $values){
$location.=substr($values, 1);
}

//remove location from the rest of the string
$keywords=preg_replace("/@[a-zA-Z0-9]+/",'',$searchwords);


$returned_result=array();

$where="";

$where1="";

$total_keywords=count($keywords);

foreach($keywords as $key =>$keyword){

$where.="place.place_name  LIKE :place_name AND location.state LIKE :state";    
$where1.="place.description LIKE :description AND location.state LIKE :state";

if($key != ($total_keywords - 1)){

$where.=" AND ";
$where1.=" AND ";   

}

}

//echo $where;



$sbl=$dabase->prepare("SELECT place.place_name, place.description, location.location FROM place    LEFT JOIN location ON place.mid=member.mid WHERE $where ORDER BY place.time");

$sbl->execute(array(
':place_name' => '%'.$keyword.'%',
':state' => '%'.$location.'%'
));

//echo $sbl;

if($sbl->rowCount() == 0){

    echo "No item found";

}

else{

while($data=$sbl->fetch()){

echo $data['place_name']."<br/>";   

echo $data['description']."<br/>";

}

}
}

到目前为止,此代码有效,但未达到我的预期,如果提及位置,它应该返回与搜索输入及其位置相关的结果,但它会返回与不相关的所有内容,它只是不将其限制为相关搜索结果或结果。

【问题讨论】:

  • 除非您提供一些数据或设置 SQL fiddle,否则我们也会遇到非常困难的情况。
  • 你在尝试什么查询?
  • @halfer 我已经编辑了我的问题,请看一下@我的代码。
  • 您能否将其分解为您输入到 MySQL 客户端的查询,以便单独调试 SQL?如果您可以将其回显出来,以便您可以将其粘贴到您的问题中,这也会有所帮助 - 目前有人必须猜测您的数据库的格式,创建它,添加测试数据,将您的代码复制到 Web 文件夹中,然后运行它,并进行更改以回答您的问题 - 这工作量太大。
  • @halfer 感谢您的帮助和指导,我终于通过调试代码解决了我的问题。

标签: php mysql sql


【解决方案1】:

很好地创建了一个 Fiddle,这非常有用。您现在已经确定地表明您的查询有效,因此问题已缩小到您的 PHP 代码。回想起来,您可以在 phpMyAdmin 或 MySQL 控制台客户端中完成此操作,但您已经学习了一项非常有用的技能,因此几乎没有浪费时间。

要继续调试,我将首先更改以下代码:

$sbl=$dabase->prepare("SELECT place.place_name, place.description, location.location FROM place    LEFT JOIN location ON place.mid=member.mid WHERE $where ORDER BY place.time");

改成:

$sql = "
    SELECT place.place_name, place.description, location.location
    FROM place
    LEFT JOIN location ON place.mid=member.mid
    WHERE $where
    ORDER BY place.time
";
$sbl=$dabase->prepare($sql);
echo $sql;

这将做同样的事情,但它会打印出你正在运行的 SQL。您会注意到我也对查询进行了格式化,因此它在您的 IDE 中更具可读性(在此站点上也是如此)。如果可以的话,我建议编写所有这样的查询。

我的猜测是您认为已提交给查询的子句尚未添加。进行此更改并找出答案。


编辑:另外,您正在编译两个 WHERE 子句,$where$where1,但您只使用其中的第一个。如果您打算同时添加两者,则需要编辑第二个。

【讨论】:

    猜你喜欢
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    相关资源
    最近更新 更多