2016-12-30 11 views
5

mam ten stół, który używam (ale nie tylko) do przechowywania przyjaciół w bazie danych:Przyjaciele test użytkownika + wspólnego przyjaciela z innym użytkownikiem

user_1 | user_2 | status 

gdzie „status” może być -1,0 lub 1. Tutaj rozważymy tylko przypadki, gdy status to "0" (oczekujący na użytkownika_1) lub "1" (zatwierdzony przez użytkownika_2). Mam następującą kwerendę, aby szukać w oczekiwaniu/zatwierdzonych znajomych na danym $ user:

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

Naszym celem jest, aby zmodyfikować zapytanie również stwierdzić, czy dana $ użytkownik2 jest częstym (zatwierdzone) przyjaciel $ user1 i każdy (zatwierdzony) przyjaciel użytkownika $ user1.

Po kilku badaniach, doszedłem do wniosku, że lewe dołączenie mogłoby załatwić sprawę, ustawiając inne pole na NULL (jeśli nie jest wzajemne) lub $ user2. Chciałbym to zrobić wydajnie. Próbowałem kilku ujęć, ale bez powodzenia.

Dzięki autorstwa góry za pomoc

EDIT: Na przykład, powiedzmy, że mamy następujące dane:

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

chcę do listy znajomych „A” i dla każdego znajomego f "a", sprawdź, czy "b" jest wspólnym przyjacielem f i "a". Również f =/= b dla wzajemnego testu. Rezultatem takiego zapytania byłoby:

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

Daj mi znać, jeśli potrzebujesz więcej wyjaśnień

+0

Nie rozumiem tego :-) Co chciałbyś dostać? Może jakiś krótki przykład? –

+0

i gdzie jest 'c | a | 1 | d'? Nie zrobiłbym tego w MySQL, ale w PHP lub w jakimkolwiek innym języku, którego używasz ... MySQL będzie wolniejszy w większych zestawach danych. –

+0

The 4th field shoult testuje tylko wzajemną przyjaźń z "b", dlatego linia, którą sugerujesz, nie powinna się pojawiać. Inną możliwością byłoby wykonanie tego w PHP i wysłanie zapytania na hasło, aby przetestować wzajemną przyjaźń z "b". Obawiałem się jednak, że wysyłanie zapytań wielokrotnych w ten sposób będzie wolniejsze niż wysyłanie pojedynczego zapytania z lewym złączeniem. Ale może masz rację, chciałbym zobaczyć podobne testy porównawcze dotyczące tego –

Odpowiedz

1

jak w zapytaniu MySQL będzie tak skomplikowany i powolny, że nie użyłby to sam, oto rozwiązanie w PHP, z jednym zapytaniem:

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

?> 

Proszę zauważyć, że nie zostało to przetestowane. Może zawierać niewielki błąd składniowy, ale powinien zwrócić tablicę wspólnych znajomych.

+0

Rzeczywiście, jest to bardzo dobra alternatywa :) dzięki za pomoc! Dam ci znać, gdy tylko będę testowany. –

1

Zmodyfikowałem trochę funkcję postu Flash Thunder. Właśnie testowane z pewnymi modyfikacjami i działa! Dzięki jeszcze raz.

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; 
} 
Powiązane problemy