2014-11-17 6 views
0

다음은 내가하려는 일입니다. 필드 안에 '태그'목록이 있습니다. 사용자가 해당 태그를 사용하여 검색 결과를 자세히 볼 수 있도록 노력하고 있습니다. 여러 단어를 쉼표로 구분하여 구분하고 대조하려면 어떻게합니까

field

는 사용자가 10 FR, 남성, 간헐적 카테터를 검색하고 싶은 말 : 다음과 같은 필드가 어떻게 표시되는지를 보여줍니다. 일부 태그 (예 : 남성, 여성)가 유사하기 때문에 %와 (과) %를 (를) 사용할 수 없습니다. 당신이 PHP에서와 같이 그것을 배열과 검색으로 깰 수있는 방법이 있습니까? 아니면 비슷한 무엇입니까?

이상적으로는 각 키워드를 구분하여 각 태그를 목록과 비교하여 해당 키워드가 모두 여기에 있는지 확인하고 싶습니다.

Select d.field_id_115 as tags,tag.tag_name, title.title, title.entry_id, cat_title.cat_name FROM finn_tagger tag LEFT JOIN finn_tagger_links link 
       ON tag.tag_id = link.tag_id 
       LEFT JOIN finn_channel_titles title 
       ON link.entry_id = title.entry_id 
       LEFT JOIN finn_category_posts cat 
       ON title.entry_id = cat.entry_id 
       LEFT JOIN finn_categories cat_title 
       ON cat.cat_id = cat_title.cat_id 
       Left JOIN finn_channel_data d 
       ON cat.entry_id = d.entry_id 
       WHERE cat_title.cat_url_title = 'catheter-supplies' 
       AND tag.tag_name ='male' 
       AND d.field_id_115 LIKE '%silicone%'; 

또한, 각 태그는 또한 자신의 분야의 수 있습니다,하지만 난 그것을 확인하기 위해 확인하는 방법을 잘 모르겠어요 :

내가 가지고 올 수 있었던 가장 가까운 뭔가처럼 하나 이상의 태그가있는 경우 두 태그가 모두 포함됩니다.

pic2

그래서 entry_id는 각 태그의 선택과 기록을 가지고 있는지 확인해야합니다. 나는 다음과 같이하려고했다 :

SELECT entry_id 
       FROM (Select title.title, title.entry_id, cat_title.cat_name FROM finn_tagger tag LEFT JOIN finn_tagger_links link 
       ON tag.tag_id = link.tag_id 
       LEFT JOIN finn_channel_titles title 
       ON link.entry_id = title.entry_id 
       LEFT JOIN finn_category_posts cat 
       ON title.entry_id = cat.entry_id 
       LEFT JOIN finn_categories cat_title 
       ON cat.cat_id = cat_title.cat_id 
       Left JOIN finn_channel_data d 
       ON cat.entry_id = d.entry_id 
       WHERE tag.tag_name IN ('silicone') 
       AND cat_title.cat_url_title = 'catheter-supplies' 
       UNION ALL 
       Select title.title, title.entry_id, cat_title.cat_name FROM finn_tagger tag LEFT JOIN finn_tagger_links link 
       ON tag.tag_id = link.tag_id 
       LEFT JOIN finn_channel_titles title 
       ON link.entry_id = title.entry_id 
       LEFT JOIN finn_category_posts cat 
       ON title.entry_id = cat.entry_id 
       LEFT JOIN finn_categories cat_title 
       ON cat.cat_id = cat_title.cat_id 
       Left JOIN finn_channel_data d 
       ON cat.entry_id = d.entry_id 
       WHERE tag.tag_name IN ('male') 
       AND cat_title.cat_url_title = 'catheter-supplies') as e 
       group by entry_id HAVING COUNT(*) > 1 

그러나 그것은 단지 가장 좋은 길로 보이지 않는다. 그리고 그것은 꽤 느리다.

+0

[http://example.com/] (http://php.net/manual/en/function.explode.php) 배열을 통해 쿼리를 생성합니다. – slapyo

+0

나쁜 DB 스키마가있는 것 같습니다. 편집/개선 할 수 있습니까? 아니면 그것을 처리해야합니까? – Uby

+0

나는 그것을 처리해야한다. 그것은 tagger 플러그인으로 expressionengine입니다. – nick

답변

0

첫째, 당신은 당신이 다음에 대해 일치 할 쉼표로 구분 된 데이터베이스 필드를 선택합니다 다음과 같이

SELECT REPLACE(comma_separated_field, ',', ' ') FROM some_table 

다음, 단어를 분해, 당신은 explode()를 사용해야합니다 :

$search_term = '10 fr, male, intermittent catheter'; 
$search_term = explode(',', $search_term); 

마지막으로 유사한 단어를 같은 문장으로 일치 시키려면 % 기호 사이의 공백을 확인하십시오. 이 방법을 사용하면 원하는대로 여러 개의 일치 항목을 성공적으로 검색 할 수 있습니다.

$like = ''; 
for($q=0; $q < count($search_term); $q++){ 
    if($q+1 != count($search_term)){ 
      $like .= "db_field LIKE '% " . $search_term[$q] . " %' AND "; 
    }else{ 
      $like .= "db_field LIKE '% " . $search_term[$q] . " %'";   
    } 
} 
+0

나는 이것을 php가 아닌 sql에서 할 필요가있다. – nick

+0

네, 알다시피,이 방법은 SQL에 대한 쿼리를 준비하고 사용자의 입력을 기반으로 하나의 쉼표로 구분 된 데이터베이스 필드에 여러 단어를 일치시켜 원하는 정확한 결과를 생성합니다. – AnchovyLegend

+0

검색어 준비에 문제가 없습니다. 나는 그와 같은 문제가있다. 누군가가 남성, 10fr 및 foley를 찾고 있다면. 이것은 "male"이라는 문자열을 가진 모든 결과를 가져옵니다. – nick

관련 문제