标记在php中搜索多个字段

时间:2009-09-23 11:02:59

标签: php jquery search tagging

我正在尝试为简报系统做搜索引擎。

我正在使用多对多关系样式设置与3个表示关系的数据库。

comms_briefings是为简报存储数据的地方 search_tags是存储标记的位置 briefings_tags是形成关系的地方

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

例如,如果用户搜索

  

$“complx queries”

系统将返回具有标记complx和查询两次的任何行,因为有两个匹配的标记。我希望将结果排序为desc,其行首先获得最多结果,并且只显示一次。

任何想法? :)

1 个答案:

答案 0 :(得分: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>';
    }
}

首先将所有tagId拉入数组,然后对简报进行单一查询,按ID分组。