我正在尝试为简报系统做搜索引擎。
我正在使用多对多关系样式设置与3个表示关系的数据库。
comms_briefings是为简报存储数据的地方 search_tags是存储标记的位置 briefings_tags是形成关系的地方
我已经this code已经 ALMOST 完美但是,由于某种原因,如果标签在简报中出现多次,它会多次返回数据库中的同一行。
例如,如果用户搜索
$“complx queries”
系统将返回具有标记complx和查询两次的任何行,因为有两个匹配的标记。我希望将结果排序为desc,其行首先获得最多结果,并且只显示一次。
任何想法? :)
答案 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分组。