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:

$query=mysql_query("SELECT * FROM users WHERE id!='$user->id'");
while($data=mysql_fetch_assoc($query)){
	if(!is_follow($user->id,$data["id"])){
		echo "$data[firstname] $data[lastname] ($data[id])<br/>\n"; //"B"
		$query2=mysql_query("SELECT * FROM followers WHERE follower_userid='$user->id' OR follower_userid='$data[id]' AND following_userid='ide kellene valami'");
		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
			echo "&nbsp;-&nbsp;".getName($data["id"])." (".$data["id"].")<br>"; //közös követők
	}
}
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.
SELECT * FROM users u WHERE 
  u.uid IN (SELECT follower_userid FROM followers WHERE following_userid = A) AND 
  u.uid IN (SELECT follower_userid FROM followers WHERE following_userid = B)
Természetesen megoldható 3 lekérdezéssel is.
function kovetoi($uid) {
  $kovetok = array();
  $results = mysql_query('SELECT follower_userid FROM followers WHERE following_userid = ' . $uid);
  while ($koveto = mysql_fetch_assoc($results)) {
    $kovetok = reset($koveto);
  }
  return $kovetok;
}
$a_kovetoi = kovetoi($a);
$b_kovetoi = kovetoi($b);
if (count($a_kovetoi) && count($b_kovetoi)) {
  $kozos_kovetok = array_intersect($a_kovetoi, $b_kovetoi);
  $results = mysql_query('SELECT * FROM users WHERE uid IN (' . implode(', ', $kozos_kovetok) . ')');
}
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:

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.