Frage Freunde eines Benutzers + gemeinsamer Test mit einem anderen Benutzer


Ich habe diese Tabelle, die ich (aber nicht nur) zum Speichern von Freunden in einer Datenbank verwende:

user_1 | user_2 | status

wobei "status" -1,0 oder 1 sein kann. Hier werden nur Fälle betrachtet, in denen der Status "0" (ausstehend für Benutzer_1) oder "1" (genehmigt von Benutzer_2) lautet. Ich habe die folgende Abfrage, um nach ausstehenden / genehmigten Freunden für einen bestimmten $ user zu suchen:

SELECT user_1,user_2,status
         FROM Friends
         WHERE (user_2 = '$user' OR user_1 = '$user') AND status >= 0;

Das Ziel hier ist, die Abfrage zu ändern, um auch zu sagen, ob ein gegebenes $ user2 ein gemeinsamer (genehmigter) Freund von $ user1 und jeder (genehmigte) Freund von $ user1 ist.

Nach einigen Recherchen fand ich heraus, dass der linke Join den Trick machen würde, indem ich ein anderes Feld auf NULL (wenn kein Gegenseitiges) oder $ user2 setzen würde. Ich würde es effizient machen wollen. Ich habe mehrere Aufnahmen probiert, aber keinen Erfolg.

Vielen Dank für Ihre Hilfe

EDIT: Sagen wir zum Beispiel, wir haben folgende Einträge:

a | b | 1
c | a | 1
c | b | 1
a | d | 1

Ich möchte die Freunde von 'a' und für jeden Freund von 'a' auflisten, ob 'b' ein gewöhnlicher Freund von f und 'a' ist. Auch gilt f = / = b für den gegenseitigen Test. Das Ergebnis einer solchen Abfrage wäre:

a | b | 1 | NULL
c | a | 1 | b
a | d | 1 | NULL

Lass es mich wissen, wenn du mehr Klarheit brauchst


5
2017-12-30 23:32


Ursprung


Antworten:


Da in MySQL die Abfrage so kompliziert und langsam wäre, dass ich sie selbst nicht verwenden würde, hier eine Lösung in PHP mit nur einer Abfrage:

<?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;
}

?>

Bitte beachten Sie, dass es nicht getestet wurde. Kann einige kleinere Syntaxfehler enthalten, sollte aber ein Array von gemeinsamen Freunden zurückgeben.


1
2017-12-31 00:37



Ich habe den Funktionspost von Flash Thunder etwas modifiziert. Nur mit einigen Modifikationen getestet und es funktioniert! Danke noch einmal.

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; 
}

1
2017-12-31 01:01