Выберите отличное ... в полнотекстовом поиске - PullRequest
0 голосов
/ 25 декабря 2010
    <?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 .....    } 
    ?>

Если у меня есть содержимое двух строк, содержащее фильтр $, оно выводит меня, но оно повторяется.Например:

title | content

asd | Это пример содержимого, номер один

das | Это пример содержимого, номер два

....

И если моими ключевыми словами являются «образец» и «число», это выводит меня в два раза больше заголовка и содержания. Как это предотвратить?

Ответы [ 2 ]

1 голос
/ 25 декабря 2010

Вы должны объединить свой первый результат и выполнить один запрос вместо выполнения цикла и запроса

$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)";
...
0 голосов
/ 25 декабря 2010

Я думаю, что это работает, но, возможно, не самый эффективный способ:

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

Таким образом, вы получите одну строку на счет матча за идентификатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...