我有这个问题:
$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查询,从根本上做了一些不太酷的事情。
由于
答案 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
而不是UNION
和DISTINCT
。它可能是一个更快的查询:
$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);