从结果集中删除避免重复

时间:2011-04-11 19:12:16

标签: php mysql sql

我有这个问题:

$relevantwords = {"one" , "two" , "three" } ;

foreach ($relevantwords as $word)
     {
        $query .=  "SELECT * FROM delhi_items WHERE heading like '%$word%' AND id!={$entry_row['id']} AND visible=1 UNION ALL "  ; 
     }
$query = implode( " " , explode(" " , $query , -3) ) ;                                                

      $query .= " ORDER BY time_stamp DESC LIMIT 0, 20 " ;
     $result_set = mysql_query($query, $connection);

这会导致我的结果集中出现多个重复项。有没有办法从结果集中检测并删除这些重复项?我知道我应该尽量避免重复,但我无法弄明白。

此外,我尝试了不同的关键字,它不起作用(因为它是一个循环,一次又一次地获取相同的条目)。

Laslty我是一个业余爱好者所以请告诉我,如果我在for循环中做了如此长的SQL查询,从根本上做了一些不太酷的事情。

由于

3 个答案:

答案 0 :(得分:2)

这不是执行此查询的正确方法;不要将UNION ALL用于多个查询。

只需使用一个查询并在相关的WHERE子句部分之间使用OR。它只会选择每一行,无论它匹配多少位。

答案 1 :(得分:1)

使用DISTINCT

SELECT DISTINCT * FROM ...

更新:

实际上DISTINCT不起作用,因为在UNION ALL中记录彼此合并之前会发生不重复。

要做你想做的事,你希望SELECT DISTINCT *在所有记录的结合之外发生。

在派生表中进行选择和联合:

SELECT DISTINCT * FROM
    (SELECT * FROM TABLE WHERE ...
    UNION ALL
    SELECT * FROM TABLE WHERE ...
    ) t
ORDER BY ...

答案 2 :(得分:1)

我会尝试一个SELECT而不是UNIONDISTINCT。它可能是一个更快的查询:

$relevantwords = {"one" , "two" , "three" } ;

$querycondition = "" ;
foreach ($relevantwords as $word)
     {
        $querycondition .= " heading LIKE '%$word%' OR"
     }
$querycondition = substr($querycondition ,0 ,strlen($querycondition)-2 ) ;

$query = " SELECT * "
       . " FROM delhi_items "
       . " WHERE ( "
       .           $querycondition 
       . "       ) "
       . "   AND id!={$entry_row['id']} "
       . "   AND visible=1 "
       . " ORDER BY time_stamp DESC "
       . " LIMIT 0, 20 " ; 
$result_set = mysql_query($query, $connection);