2009-09-23 31 views
0

我正在尝试做一个简报系统的搜索引擎。标签搜索与php中的许多字段

我使用多对多的关系风格设置与3个数据库表示关系。

comms_briefings是数据存储的简报 search_tags是在标签存储 briefings_tags是对关系的形成

我有this code已其中ALMOST完美然而,由于某种原因,它返回如果标签在简报中多次出现,则数据库中的同一行会多次出现。

例如,如果用户搜寻SEARCH_TERM_EXAMPLES

$“期复合查询”

系统会返回具有标签期复合和查询两倍有两个匹配的标签,任何行。我希望将结果排序为desc,以获得最多结果的行,并且只出现一次。

有什么想法? :)

回答

1

像这样的东西应该做的:

function searchTags($tags) { 

    $tags = explode(' ', $tags); 
    $tagIds = array(); 

    foreach($tags as $key) { 
     $sql = mysql_query("SELECT `id` FROM `search_tags` WHERE `tag` = '".$key."'"); 
     while($r=mysql_fetch_object($sql)) 
      $tagIds[] = $r->id; 
    } 

    $query = mysql_query("SELECT comms_briefings.*, COUNT(*) AS num 
     FROM comms_briefings, briefings_tags 
     WHERE briefings_tags.tag_id IN ('" . implode("','", $tagIds) ."') AND briefings_tags.briefing_id = comms_briefings.id 
      GROUP BY comms_briefines.id 
     ORDER BY num DESC, `created` DESC"); 

    while($r = mysql_fetch_object($query)) { 

     $summation = preg_replace('^(.*)\n(.*)^', '$1\\n$2', $r->summation); 
     $summation = preg_replace('/[\r]+/', '', $summation); 

     echo '<li class="message unread" id="msg-'.$r->id.'">'; 
     echo '<h3><a href="">'.$r->title.'</a></h3>'; 
     echo '<ul class="details"> 
       <li><span>Importance:</span> '.$r->importance.'</li> 
       <li><span>Date:</span> '.$r->created.'</li> 
       <li><span>Summary:</span> '.$summation.'</li> 
      </ul> 
      <div class="clr"></div> 
      </li>'; 
    } 
} 

所有tagIds被拉入一个数组第一,那么你做的简报单个查询,按id分组。

+0

看起来不错,greg,但它带着一个错误回来警告:mysql_fetch_object():提供的参数不是在/Applications/MAMP/htdocs/sdg/classes/messages.classes.php在线的有效MySQL结果资源17 while while语句 – 2009-09-23 11:23:14

+0

#1064 - 您的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,以便在'COUNT(*)AS num WHERE'briefings_tags.tag_id'IN('1,2,5')和第2行的'简报'附近使用正确的语法 – 2009-09-23 11:27:24

+0

嗯,你复制所有的报价?它应该看起来像IN('1','2','5') – Greg 2009-09-23 12:45:53