从foreach循环中删除重复的字符串

时间:2017-01-25 06:38:33

标签: mysqli foreach duplicates

我试图从foreach循环的结果中删除重复项:

foreach ($tags as $tag) {
    $sql = "SELECT url,title,image,gift FROM listings LEFT JOIN tags ON listings.id=tags.product_id INNER JOIN tag_names ON tags.tag_id=tag_names.tag_id WHERE tag_names.tag_name=? and id!=$id ORDER BY RAND() LIMIT 5";
    $stmt = mysqli_prepare($mysqli, $sql);
    $stmt->bind_param('s',$tag[0]);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_all();

    if (count($row) > 0) { 
        echo etc. 
    }

问题是我不知道如何在不同的标签下跳过回复重复的产品。即

同一产品可以在标签A下面和标签B下面,但我只希望它显示一次。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

首先使用例如子句'IN'获取整个数据集,然后迭代。您将只有一个查询。

  
    

这个问题是每个查询都有相当多的开销。发出1个查询返回100个结果比发出100个查询每个返回1个结果要快得多。如果您的数据库位于不同的计算机上(例如,距离网络1-2毫秒),则尤其如此。在这种情况下,连续发出100个查询的最低成本为100-200ms,即使它们可以立即被MySQL满足。

  

https://secure.phabricator.com/book/phabcontrib/article/n_plus_one/

答案 1 :(得分:-1)

foreach ($tags as $tag) {
    $sql = "SELECT distinct url,title,image,gift FROM listings LEFT JOIN tags ON listings.id=tags.product_id INNER JOIN tag_names ON tags.tag_id=tag_names.tag_id WHERE tag_names.tag_name=? and id!=$id ORDER BY RAND() LIMIT 5";
    $stmt = mysqli_prepare($mysqli, $sql);
    $stmt->bind_param('s',$tag[0]);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_all();

    if (count($row) > 0) { 
        echo etc. 
    }
}

试试这个。