0

ブリーフィング システム用の検索エンジンを作成しようとしています。

私は、関係を表す 3 つのデータベースを使用して、多対多の関係スタイルのセットアップを使用しています。

comms_briefings は、ブリーフィングのデータが保存される場所です search_tags は、タグが保存される場所です Briefings_tags は、関係が形成される場所です

私はすでにこのコードを持っていますが、これはほとんど完璧ですが、タグがブリーフィングに複数回表示されると、何らかの理由でデータベース内の同じ行が複数回返されます。

たとえば、ユーザーが次を検索した場合

$ "複雑な問い合わせ"

一致するタグが 2 つあるため、システムはタグ complx と照会を含む行を 2 回返します。最初に最も多くの結果を取得し、一度だけ表示される行で、結果を降順で並べたいと思います。

何か案は?:)

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>';
    }
}

最初にすべての tagIds が配列に取り込まれ、次にブリーフィングに対して 1 つのクエリを実行し、ID でグループ化します。

于 2009-09-23T11:09:24.347 に答える