我在为简报系统做搜索引擎。
我正在使用多到多关系风格的设置,其中有3个数据库表示关系。
comms_briefings是存储简报的数据的地方,search_tags是存储标记的地方,briefings_tags是关系形成的地方。
我已经有了这段代码,但是由于某种原因,如果一个标记在简报中出现不止一次,它就会在数据库中多次返回相同的行。
例如,如果用户搜索
$“共犯查询”
当有两个匹配的标签时,系统将返回任何有标记的行和查询两次。我希望将结果与获得最多结果的行排序为desc,并且只出现一次。
有什么想法吗?)
发布于 2009-09-23 11:09:24
像这样的事情应该可以做到:
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分组。
https://stackoverflow.com/questions/1465323
复制相似问题