0

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

我正在使用多对多关系样式设置,其中包含 3 个表示关系的数据库。

comms_briefings 是为简报存储数据的位置 search_tags 是存储标签的位置 Briefings_tags 是形成关系的位置

我已经有了这个几乎完美的代码,但是由于某种原因,如果一个标签在简报中出现多次,它会在数据库中多次返回同一行。

例如,如果用户搜索

$ "复杂查询"

系统将返回任何具有标签 complx 的行并查询两次,因为有两个匹配的标签。我希望将结果与首先获得最多结果的行进行降序排列,并且只出现一次。

有任何想法吗?:)

4

1 回答 1

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 分组。

于 2009-09-23T11:09:24.347 回答