2012-07-02 6 views
1

코드를 실행할 때 쿼리를 통해 실행되는 키워드가 데이터베이스의 키워드와 동일하지 않기 때문에 대상을 검색 할 수 없습니다.쉼표로 구분 된 키워드 목록 찾기

키워드 :

$keywords = 'spaghetti,macaroni,hamburger'; 

검색어 :

mysql_query("SELECT * FROM ---- WHERE keywords LIKE '%$keywords%' ORDER BY id DESC LIMIT 1"); 

나는이 키워드 항목을 대상으로하고있다 :

food, restaurant, hamburger, spaghetti, taco,pie 

봤는데 이후 여기에 간단하게 뭔가를 누락 될 수 있습니다 12 시간 동안 똑바로 일 했어. 그러나 나는이 문제를 해결하기 위해 노력한 모든 것에 행운이 없었다.

일치하는 키워드가 2 개 있기 때문에 쿼리에서 대상 항목을 반환해야합니다.

어떻게해야합니까? 당신이 코멘트에서 볼 수 있듯이

+5

을'LIKE' 작동하지 방법은 그. 데이터를 정규화하여 키워드가 레스토랑 (또는 주 레코드가 무엇이든지)과 연결된 별도의 테이블에 표시되도록 할 수 있습니다. –

+0

질문 제목에'[해결] '을 추가 할 필요가 없습니다. * 당신은 이미 적절한 것을했고 눈금을 확인했습니다. – mario

답변

2
$like = array(); 
$keywords = explode(',' , $keywords); 
foreach($keywords as $keyword) { 
    $like[] = "`keywords` LIKE '%$keyword%'"; 
} 
$like = implode(' OR ', $like); 
$query = "SELECT * FROM `table` WHERE $like ORDER BY id DESC LIMIT 1"; 
2

당신은 당신이

<?php 

$keywords = 'spaghetti,macaroni,hamburger'; 

$query = "SELECT * FROM mytable WHERE 1=1"; 

$keywords = explode(',', $keywords); 

if (count($keywords)) { 
    $query .= sprintf(
     " AND (%s)", 
     implode(' OR ', array_map(function($word){ 
      return "keywords LIKE '%{$word}%'"; 
     }, $keywords)) 
    ); 
} 

echo $query; 

// SELECT * FROM mytable WHERE 1=1 AND (keywords LIKE '%spaghetti%' OR keywords LIKE '%macaroni%' OR keywords LIKE '%hamburger%') 

처럼 뭔가를 할 수있는 키워드를 해체하고 각자

SELECT * FROM mytable 
WHERE keywords LIKE '%spaghetti%' OR keywords LIKE '%macaroni%' 
-- ... 

에 대해 별도의 LIKE 비교를 할 필요가 이것을 처리하는 더 좋은 방법이 있지만,이 기초적인 질문은 간단한 답을 찾고 있다고 가정합니다.

입력 살생을 수행하지 않거나 다른 오류 방지를 추가하지 않습니다. 이와 같은 쿼리를 작성하는 것은 그리 신뢰할만한 것이 아니므로 향후 일반적인 함정을 피하기 위해 PHP/MySQL에 대해 계속 배워야합니다. 그러나, 나는 좀 더 진보 된 접근법이 현재 귀하의 도달 범위에서 조금 벗어나 있다고 생각합니다. 다른 사람이 그것을 위해 이동 :

+0

또는'and' 질문의 의도가 확실하지 않습니다. – Ben

+2

쿼리 최적화 프로그램이'키워드 '% spaghetti'또는 키워드 LIKE '% macaroni %''를 최적화 할 수 없으며이 옵션은 순차 검색이됩니다. 색인.인덱스를 사용할 수 있으므로 정규화가 더 좋은 해결책이 될 수 있습니다. '키워드 IN ('macaroni', 'spaghetti') ' –

+2

@FrankFarmer - 그건 OP가 묘사 한 문제의 한 측면입니다. 아무런 대답도 그것을 피하려고하지 않습니다. – MatBailie

1

을이 시도, 모든 수단에 의해, 그들은 영업 이익은 이해할 수 있다고 생각 더 나은 기술을 제공하고자하는 경우, 여러에게 or 조항

Select * from mytable 
where keywords REGEXP 'spaghetti|macaroni|hamburger' 
+1

게시물을 수정했습니다. 당신은 Google Prettify 마크 업을 위해 첫 번째 태그 인 [PHP]'를 사용하고 있기 때문에 잡혀 가고있었습니다. 이것은 HTML 주석에 의해, SQL' ' – Ben

1

당신을 사용하는 것보다 빠를 수 있습니다 , 분리하고 작품 LIKE를 사용해야합니다, 당신이 시도 할 수 있습니다 :

$keywords = 'spaghetti,macaroni,hamburger'; 

$arrayWords = explode(',', $keywords); 

$like = ''; 

foreach($arrayWords as $word) 
    $like .= empty($like) ? " keywords LIKE '%$word%' " : " OR keywords LIKE '%$word%' "; 

mysql_query("SELECT * FROM ---- WHERE $like ORDER BY id DESC LIMIT 1"); 
1
mysql_query("SELECT * FROM ---- WHERE keywords LIKE '%". implode("%' OR keywords LIKE '%", explode(",", $keywords)) ."%' ORDER BY id DESC LIMIT 1"); 
2

Stori 열 안의 CSV로 여러 값을 입력하는 것은 일반적인 SQL 안티 패턴입니다. 그것은 최적화하는 데 사용할 어렵고도 어렵습니다 :

How to fix the Comma Separated List of Doom

+0

Hmm에 대해 변경 될 수 있습니다. 흥미 롭 군. 내 북마크에서 멋지게 보일 것입니다. – localhost