在全文搜索中选择distinct ...

时间:2010-12-25 16:19:12

标签: mysql full-text-search

    <?php session_start(); 
    $user =$_GET['user']; 
    $conn = mysql_connect("localhost","...","...");
    mysql_select_db("..."); 
$sql= "SELECT filter FROM userfilter WHERE user='$user'"; 
$mksql = mysql_query($sql); while($row =mysql_fetch_assoc($mksql)) {    
$filter=$row['filter'];     
    $sql2 = "SELECT DISTINCT * FROM rss WHERE MATCH(content,title) AGAINST ('$filter')";    
    $mksql2 = mysql_query($sql2) or die(mysql_error());
    while($rows=mysql_fetch_assoc($mksql2))
    { echo .....    } 
    ?>

如果我有两行内容包含$ filter,它会输出我的内容,但它正在重复。 例如:

  

标题|内容

     

asd |这是一个样本内容,排名第一

     

DAS   |这是一个   样本内容,第二名

...

如果我的关键字是“样本”和“数字”,它会输出两倍的标题和内容。如何防止?

2 个答案:

答案 0 :(得分:1)

您应该合并第一个结果,然后发出单个查询,而不是执行循环和查询

$filters = array();
while($row =mysql_fetch_assoc($mksql)) 
{
  $filters[$row['filter']] = '+'.$row['filter'];
}
/* free result */

$sql2 = "SELECT * FROM rss ".
        "WHERE MATCH(content,title) ".
        "AGAINST ('".implode(' ', $filters)."' in boolean mode)";
...

答案 1 :(得分:0)

我认为这有效但可能不是最有效的方式:

SELECT *, MATCH(Description) AGAINST ('$filter') AS score FROM table
WHERE score > 1
GROUP BY score, id;

这样,每个ID每个匹配分数就会得到一行。