如何在使用MYSQL从数据库中检索数据时忽略foreach循环中的重复行

如何在使用MYSQL从数据库中检索数据时忽略foreach循环中的重复行

问题描述:

我有以下代码来查找文本正文中的相似关键字并显示具有相同关键字的相关链接。如何在使用MYSQL从数据库中检索数据时忽略foreach循环中的重复行

但问题是,例如,如果两个关键字在第2排体,第2排显示两次,但我需要第2排显示一次。我尝试了SELECT DISTINCT,但它在foreach循环中无法正常工作。

$tags2=explode(",",$tags); 
foreach ($tags2 as $i) { 
    $cat_sqlii="SELECT DISTINCT id, source,title,summary,newsText,photo,mainphoto,link,Date,tags FROM newxtext WHERE (newsText LIKE '%$i%')"; 
    $cat_sql_queryii=mysqli_query($con,$cat_sqlii); 
    $cat_sql_rowii=mysqli_fetch_assoc($cat_sql_queryii); 
    do{ 
     echo $cat_sql_rowii['id'].'<br/>'; 
    }while($cat_sql_rowii=mysqli_fetch_assoc($cat_sql_queryii)); 
} 
+0

'distinct'只适用于并发查询。在你的foreach循环中,你为每个关键字发出一个查询。这些查询不了解彼此。我建议使用接收结果的临时表,然后_then_使用'distinct'查询此表。 – Psi

只是做一个查询,使用OR任何标签的做检查。

$patterns = array(); 
foreach ($tag in explode(',', $tags)) { 
    $patterns[] = "newstext like '%$tag%'"; 
} 
$where = implode(' OR ', $patterns); 
$cat_sqlii="SELECT id, source,title,summary,newsText,photo,mainphoto,link,Date,tags 
      FROM newxtext 
      WHERE ($where)"; 
$cat_sql_queryii=mysqli_query($con,$cat_sqlii); 
while ($cat_sql_rowii = mysqli_fetch_assoc($cat_sql_queryii)) { 
    echo $cat_sql_rowii['id'].'<br/>'; 
} 
+0

小心:当稍后添加其他条件时,这可能会导致不需要的行为。更好地放置'$ where'-子句的括号 – Psi

另一种方法可以是使用临时表接收每次迭代的结果,并查询该表中底:

mysqli_query($con, "CREATE TEMPORARY TABLE tmpSearchResults(id int primary key) ENGINE=Memory"); 

$tags2=explode(",",$tags); 
foreach ($tags2 as $i) { 
$insertToTemp ="INSERT INTO tmpSearchResults 
     SELECT id 
     FROM newxtext 
    WHERE (newsText LIKE '%$i%')"; 
    mysqli_query($con,$insertToTemp); 
} 

$queryFromTemp = "SELECT DISTINCT n.id, n.source,n.title,n.summary,n.newsText,n.photo,n.mainphoto,n.link,n.`Date`,n.tags 
    FROM tmpSearchResult r 
    JOIN newxtext n 
    WHERE r.id = n.id"; 

$resultSet = mysqli_query($con,$queryFromTemp); 
while($data = mysqli_fetch_assoc($resultSet)){ 
    // ... process here 
} 
mysqli_free_result($resultSet); 

当您关闭连接,临时表将被自动删除。

如果您希望获得巨大的搜索结果,请考虑使用另一个存储引擎而不是MEMORY作为临时表。