2011-04-11 50 views
1

重复我有这个疑问:移除避免从结果集

$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查询的事情。

感谢

+1

不是一个解决方案,而是一个建议:我认为你真的需要看看[MySQL的FULLTEXT搜索](http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html)。 – netcoder 2011-04-11 19:29:56

+0

谢谢,我会这样做 – 2011-04-11 19:34:21

回答

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); 
+0

完美的作品!要花时间回答我的问题,并教我一种新技术! – 2011-04-11 19:46:39

1

使用DISTINCT

SELECT DISTINCT * FROM ... 

UPDATE:

其实DISTINCT不起作用,因为记录是相互的UNION ALL合并之前会发生未移除重复。

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

做一个派生表内选择和工会-ING:

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

试过,它没有工作 – 2011-04-11 19:15:16

+0

糟糕,对不起,是啊......我猜DISIONCT会发生在UNION之前的每个选择......我会用另一个建议修改答案 – 2011-04-11 19:32:18

2

这是不正确的方式来做这个查询;请勿将UNION ALL用于多个查询。

只需使用一个查询并在相关WHERE子句部分之间使用OR即可。它将只选择一行,而不管它匹配多少位。