我正在做一个学校项目,其中包括在php中做一个类似Facebook的应用程序,并且我在处理一个棘手的SQL请求时遇到了麻烦。
我的数据库配置是这样的:
我想在我的朋友列表中找到已经不在的朋友的朋友,以便推荐他们,
我的SQL请求让我的朋友列表正常工作,所以我在做的是我要循环所有朋友,然后选择他们的朋友,但是在这里, 我不知道如何选择他们而不选择已经是我朋友的朋友
这是我循环遍历每个朋友的方式: (我认为这不是这样做的好方法)
<?php
function recommendation($id)
{
global $pdo;
$sql = "SELECT *
FROM user u
LEFT JOIN friends f on u.id = f.iduser
WHERE isvalidate = 1
AND ((f.iduser = ? AND u.id != ?) OR ((f.idfriend = ? AND u.id != ?)))
GROUP BY u.id";
$q = $pdo->prepare($sql);
$q->execute(array($id, $id, $id, $id));
echo "<p>Vous connaisser peut etre:</p>
<ul id ='recommendation'>";
$amiscommun = array();
while ($line = $q->fetch()) {
//recupération de la liste des amis
//Pour chaque amis recupération de leur liste d'amis egalement
$sql = "SELECT *
FROM user u
LEFT JOIN friends f on u.id = f.iduser
WHERE isvalidate = 1
AND (((f.iduser = ? AND u.id != ?) OR ((f.idfriend = ? AND u.id != ?)))
AND ((f.iduser = ? AND u.id != ?) OR ((f.idfriend = ? AND u.id != ?))))
AND (f.iduser != (SELECT * FROM))
GROUP BY u.id";
$q2 = $pdo->prepare($sql);
$q2->execute(array($line['id'], $line['id'], $line['id'], $line['id'], $line['id'], $id, $line['id'], $id));
$amis = array();
while ($line2 = $q2->fetch()) {
echo "<li>" . $line2['login'] . " est un amis de " . $line['login'] . "</li>";
$amis[$line['login']][] = array($line2['login']);
$amiscommunnbr[$line2['login']][] = $line['login'];
//Stockage a chaque iteration de boucle des amis commun dans un tableau
}
}
$newarray = $amiscommunnbr;
if (!empty($newarray)) {
foreach ($newarray as $key => $value) {
$nbr = count($value);
echo "<li><a href='index.php?action=bio?" . $key . "'>" . $key . "</a>- " . $nbr . " Amis en commun(";
foreach ($value as $key2 => $value2) {
echo "<a href='index.php?action=bio?" . $value2 . "'>" . $value2 . "</a>";
}
echo ")</li>";
}
}
echo "</ul>";
}
答案 0 :(得分:1)
“从iduser所在的朋友中选择*(选择GROUP_CONCAT(idFriend)形式的用户u加入朋友f,其中f.iduser = u.id和u.id = $ uid)并且ID NOT IN(从中选择GROUP_CONCAT(id)朋友,其中iduser = $ id)“;
:我认为这对您有帮助。让我知道您是否遇到任何问题。 :我已更新查询。