2014-12-17 4 views
-5

Я хочу создать поисковую систему, с помощью которой любой может искать услугу в месте и получать результат, например, кто-то вводит «рестораны @LA», результат показывает весь ресторан в Лос-Анджелесе.Поиск MySQL с несколькими значениями и несколькими таблицами

У меня есть два стола, на которых указано название ресторана, а другое - место, где они связаны с идентификатором. В моем 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/>"; 

} 

} 
} 

До сих пор этот код работает, но не так как я ожидал, что он должен возвращать результаты, связанные с поиском входа и его расположение, если место упоминается, но он возвращает все, как связанные с не связаны она просто не ограничивает его к соответствующему результату или результатам поиска.

+2

Если вы не предоставите некоторые данные или не настроите скрипт SQL, нам тоже будет очень тяжело. –

+0

Какой запрос вы пытаетесь? –

+0

@halfer Я отредактировал мой вопрос, пожалуйста, посмотрите @ мои коды. – rapulu

ответ

1

Хорошо сделано, создавая скрипку, это очень полезно. Теперь вы убедительно доказали, что ваш запрос работает, поэтому проблема была сужена до вашего 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 (и на этом сайте). Я рекомендую писать все такие запросы, если это возможно.

Мое предположение, что предложения, которые, по вашему мнению, были отправлены в запрос, не были добавлены. Внесите это изменение и узнайте.


Edit: также, вы компилируете два WHERE положения, $where и $where1, но потом использовать только первый из них. Если вы намеревались добавить и то и другое, вам нужно будет отредактировать второй.

Смежные вопросы