ugrás a tartalomhoz

Közös követők lekérése

vitaliyplay · 2011. Aug. 5. (P), 01.57
Sziasztok!

Adott 2 db tábla: users, followers.

users szerkezete:
ID, firstname, lastname, stb.

followers szerkezete:
ID, follower_userid (ki követ), following_userid (kit)

A = a bejelentkezett felhasználó (most te)
B = miközben végig megy az összes felhasználón egy ciklus, ő az aktuális felhasználó; nem egyenlő "A"-val; nem követi "A"-t

- Ha egy felhasználó követ valakit, nem jelenti azt, hogy a másik is követi őt
- van egy "ajánlott felhasználók" rész az oldalon, ahol közös követők alapján listázza ki a felhasználókat
- "A" felhasználó adatait az $user objektum tárolja ($user->id)
- ha új felhasználót akarsz létrehozni: $user2=new User(felhasználó ID-je);

Kellene egy olyan algoritmus, amely visszaadja a két felhasználó közös követőinek számát.

Eddig ezzel próbálkoztam:
  1. $query=mysql_query("SELECT * FROM users WHERE id!='$user->id'");  
  2. while($data=mysql_fetch_assoc($query)){  
  3.     if(!is_follow($user->id,$data["id"])){  
  4.         echo "$data[firstname] $data[lastname] ($data[id])<br/>\n"//"B"  
  5.         $query2=mysql_query("SELECT * FROM followers WHERE follower_userid='$user->id' OR follower_userid='$data[id]' AND following_userid='ide kellene valami'");  
  6.         while($data2=mysql_fetch_assoc($query2)) //tulajdonképpen ez nem is kell, csak egy mysql_num_rows, csak ellenőrzés képpen van itt  
  7.             echo "&nbsp;-&nbsp;".getName($data["id"])." (".$data["id"].")<br>"//közös követők  
  8.     }  
  9. }  
Nos, ha meg lehetne csinálni a $query-t úgy, hogy alapból csak azokat a felhasználókat mutassa, akik nem követik "A"-t, az jó lenne - a LEFT JOIN ON-nal próbálkoztam sikertelenül - ezért írtam egy is_follow()-t melynek első paramétere a follower_userid, második a following_userid.
Szóba jött még nálam a DISTINCT és a GROUP BY, de viszonylag tapasztalatlan vagyok a kettőt illetően.
Itt találtok egy képet az elképzelésemről, ha "A"=1 és "B"=3, a visszatérési érték 2 lesz, mivel 2 db közös követő van. (Remélem helyes a kép, mert elég fáradt voltam készítésekor xd.)

Az építő jellegű hozzászólásokat előre is köszönöm.
 
1

Gondold át

Poetro · 2011. Aug. 5. (P), 02.35
Van 2 felhasználó A és B. A követői azok akik követik A-t, B követői akik követik B-t. Neked ennek a két halmaznak kell a metszete.
  1. SELECT * FROM users u WHERE   
  2.   u.uid IN (SELECT follower_userid FROM followers WHERE following_userid = A) AND   
  3.   u.uid IN (SELECT follower_userid FROM followers WHERE following_userid = B)  
Természetesen megoldható 3 lekérdezéssel is.
  1. function kovetoi($uid) {  
  2.   $kovetok = array();  
  3.   $results = mysql_query('SELECT follower_userid FROM followers WHERE following_userid = ' . $uid);  
  4.   while ($koveto = mysql_fetch_assoc($results)) {  
  5.     $kovetok = reset($koveto);  
  6.   }  
  7.   return $kovetok;  
  8. }  
  9. $a_kovetoi = kovetoi($a);  
  10. $b_kovetoi = kovetoi($b);  
  11. if (count($a_kovetoi) && count($b_kovetoi)) {  
  12.   $kozos_kovetok = array_intersect($a_kovetoi$b_kovetoi);  
  13.   $results = mysql_query('SELECT * FROM users WHERE uid IN (' . implode(', '$kozos_kovetok) . ')');  
  14. }  
2

Táblát önmagához kapcsolod

pp · 2011. Aug. 5. (P), 05.51
A táblát önmagához kapcsolod. A trükk az, hogy más álnevet adsz neki:
  1. SELECT a.follower FROM followers a LEFT JOIN followers b ON a.follower = b.follower AND a.following != b.following WHERE a.following=2 AND b.following=4;  
pp
3

Köszönöm

vitaliyplay · 2011. Aug. 6. (Szo), 20.57
Köszönöm a gyors válaszokat, Poetro első megoldását választottam.