Zapytanie do bazy danych

0

Baza danych to minifacebook. W tabeli grupy mam id, IDusera, values

IDusera to id z tabeli user, values też. np Marek (id=1), zna Tomka (id=2) oraz Ewelinę(id=3) i tu bedzie wpisa do tabeli grupy wyglądający tak: id = 1, IDusera =1, values = 2 oraz id = 1, IDusera =1, values = 3. Chcę napisać teraz takie zapytanie: tworze grupę ludzie, w której są osoby znajoce moich przyjaciół (znają conajmniej dwie osoby z mojej listy), ale nie są ze mną znajomymi. Jest to grupa ludzi, którzy są sugerowani jako moi znajomi. Jak Wyciągnąć te dane z tej tabeli?

0

nie będę zbyt oryginalny, ale zarzucę linkami, które mogą pomóc, sam kiedyś się interesowałem jak działają "wspólni znajomi" na portalach:
http://9fingers.pl/questions/2094/%5BMySQL%5D-Wspolni-znajomi
http://forum.php.pl/index.php?showtopic=155147&pid=770342&mode=threaded&start=#entry770342
btw jak już to temat powinien chyba siedzieć w dziale baz danych :P

0

Prawda, zły dział :/ bazy danych,eh. dzięki za linki, biorę się od razu za nie :)

0
SELECT 
	z1.user_id, 
	z2.user_id AS znajomy 
FROM 
	znajomki z1 
	JOIN 
	znajomki z2 
	ON 
		z1.znajomy_id = z2.znajomy_id 
		AND z1.user_id <> z2.user_id 
WHERE 
	z1.user_id = 1 
GROUP BY 
	z1.user_id, 
	z2.user_id
HAVING 
	Count(z2.id)>1

To zapytanie zwróci ci listę osób, które mają więcej niż 1 wspólnego znajomego z user_id=1 (widać to we WHERE)

SELECT x.* FROM (
SELECT 
	z1.user_id, 
	z2.user_id AS znajomy 
FROM 
	znajomki z1 
	JOIN 
	znajomki z2 
	ON 
		z1.znajomy_id = z2.znajomy_id 
		AND z1.user_id <> z2.user_id 
WHERE 
	z1.user_id = 1 
GROUP BY 
	z1.user_id, 
	z2.user_id
HAVING 
	Count(z2.id)>1
)
x 
LEFT JOIN 
	znajomki z 
	ON 
		(x.user_id=z.user_id AND x.znajomy=z.znajomy_id) 
		OR (x.user_id=z.znajomy_id AND x.znajomy=z.user_id)
WHERE z.user_id IS NULL

To zapytanie (jak widzisz wewnątrz jest dokładnie takie samo) zwróci ci listę osób, które mają razem z user_id=1 przynajmniej 2 wspólnych znajomych i DODATKOWO nie mają siebie nawzajem w znajomych (obojętnie który - może być tylko jednostronnie)

0

Z tą moją tabelą tak jest dobrze(kod poniżej)? Czy coś poknociłem?
Tabela wygląda tak (ma tylko trzy kolumny) id, IDuser, val i nic więcej, do tego poźniej chcę tylko dołączyć jeszcze tabele LEFT JOIN z danymi userów jak imie czy nazwisko, ale to juz chyba dam rade zrobić, tylko z tym mam problem, dalej :(

return $s->select("SELECT x.* FROM (
SELECT 
   z1.IDuser, z1.val,
        z2.IDuser AS znajomy 
FROM 
        groups z1 
        JOIN 
        groups z2 
        ON 
                z1.val = z2.val AND z1.IDuser <> z2.IDuser 
WHERE 
        z1.IDuser ='".$this->id."' 
GROUP BY 
        z1.IDuser, 
        z2.IDuser
HAVING 
        COUNT(z2.id)>1
)
x 
LEFT JOIN 
        groups z 
        ON 
                (x.IDuser=z.IDuser AND x.znajomy=z.val) 
                OR (x.IDuser=z.val AND x.znajomy=z.IDuser)
WHERE z.IDuser IS NULL");
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1