我有这个表(但不仅仅是)用于在数据库中存储朋友:
user_1 | user_2 | status
其中'status'可以是-1,0或1.这里,我们将仅考虑状态为'0'(等待user_1)或'1'(由user_2批准)的情况。我有以下查询来查找给定$ user的待定/已批准的朋友:
SELECT user_1,user_2,status
FROM Friends
WHERE (user_2 = '$user' OR user_1 = '$user') AND status >= 0;
此处的目标是修改查询以告知给定的$ user2是否是$ user1的常见(已批准)朋友以及$ user1的每个(已批准)朋友。
经过一些研究,我发现左连接可以通过将另一个字段设置为NULL(如果没有相互)或$ user2来实现。我想要有效地做到这一点。我尝试了几次,但没有成功。
先谢谢你的帮助
编辑:例如,假设我们有以下条目:
a | b | 1
c | a | 1
c | b | 1
a | d | 1
我想列出'a'的朋友和'a'的每个朋友f,确认'b'是f和'a'的共同朋友。另外,f = / = b用于相互测试。这种查询的结果将是:
a | b | 1 | NULL
c | a | 1 | b
a | d | 1 | NULL
如果您需要更多说明,请告诉我
答案 0 :(得分:1)
正如在MySQL中查询会如此复杂和缓慢,我自己也不会使用它,这里是PHP的解决方案,只有一个查询:
<?php
// $db = mysqli_connect(...);
function findMutualFriends($of,$mutual_with){
global $db;
$user_friends = array();
$mutual_friends = array();
$results = array();
$res = mysqli_query($db,"SELECT user_1,user_2,status FROM Friends WHERE ((user_2 = '$of' OR user_1 = '$of') OR (user_2 = '$mutual_with' OR user_1 = '$mutual_with')) AND status >= 0;";
while($row = mysqli_fetch_assoc($res)){
if($row['user_1'] == $of || $row['user_2'] == $of){
$user_friends[] = (($row['user_1'] == $of) ? $row['user_2'] : $row['user_1']);
}
if($row['user_1'] == $mutual_with || $row['user_2'] == $mutual_with){
$mutual_friends[(($row['user_1'] == $mutual_with) ? $row['user_2'] : $row['user_1'])] = 1;
}
}
foreach($user_friends as $friend){
if($mutual_firends[$friend]){
$results[] = $friend;
}
}
return $results;
}
?>
请注意,它尚未经过测试。可能包含一些小的语法错误,但应该返回一个共同朋友的数组。
答案 1 :(得分:1)
我修改了一下Flash Thunder的功能帖子。刚测试了一些修改,它的工作原理!再次感谢。
function findMutualFriends($pdo, $of,$mutual_with){
$user_friends = array();
$mutual_friends = array();
$results = array();
$query = "SELECT user_1,user_2,status FROM Friends WHERE ((user_2 = '$of' OR user_1 = '$of') OR (user_2 = '$mutual_with' OR user_1 = '$mutual_with')) AND status = 1;";
$prep = $pdo->prepare($query);
$res = $prep->execute();
$rows = $prep->fetchAll();
foreach ($rows as $row) {
if($row['user_1'] == $of || $row['user_2'] == $of) {
$user_friends[] = ($row['user_1'] == $of ? $row['user_2'] :$row['user_1']);
}
if($row['user_1'] == $mutual_with || $row['user_2'] == $mutual_with) {
$mutual_friends[($row['user_1'] == $mutual_with ? $row['user_2'] :$row['user_1'])] = true;
}
}
foreach($user_friends as $friend) {
$results[$friend] = $mutual_friends[$friend] == true ? true : false;
}
return $results;
}