我试图从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下面,但我只希望它显示一次。
任何帮助都将不胜感激。
答案 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.
}
}
试试这个。