Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql] Powiązania między użytkownikami
Forum PHP.pl > Forum > PHP
mrjozo
Witam,

mam problem ze strukturą bazy danych oraz sposobem rozwiązania dla następującego zagadnienia:

na stronie użytkonicy mają możliwości dodawania przyjaciół, więc do tego zrobiłem tabelez polami:

user_id,friend_id

będzie dużo użytkowników więc istnieje osobna tabela, dla uzytkowników zignorowanych i czekających na akceptację:

user_id,friend_id,type

wiadomo po zaakceptowaniu użytkownik zostaje przeniesiony do pierwszej tabeli

Teraz jeśli wchodzę na stronę jakiegoś użytkownika to chcę zobaczyć wspólnych przyjaciół oraz takich, których tylko on ma... opis tego problemu jest opisany w wątku: Temat: mysql Jak wykonac zapytanie do bazy

//czyli dotąd można powiedzieć, że mam gotowe i wiem jak zrobić

Do tego pojawia sie jeszcze jedno zagadnienie, gdy wejdę na stronę użytkownika, który nie jest moim znajomym, a jest znajomym mojego znajomego to musi się tam wyświetlić powiązanie, tj "ja -> mój znajomy -> użytkownik na którego stronie jestem" obsługiwane ma być maksymalnie 4 krotne zagłębianie, np "ja -> mój znajomy -> znjomy znajomego -> użytkownik" gdy do tego użytkownika nie ma powiązania w 4 krokach nic się nie wyświetla

Mógłby ktoś poradzić jak zaprojektować bazę dla tych powiązań i jak mniej więcej rowzwiązać to od strony php?
Myślę, że jeśli będe miał już bazę z php będzie mniejszy problem.

//Nie wiedziałem gdzie lepiej pasuje ten wątek d baz danych czy php, ale wyszło, że znalazł sie tutaj
joebezucha
Hej żeby to zrobić musisz korzystać ze złączeń w zapytaniach SQL (wielokrotne złączanie tabeli user_friend samej ze sobą)

Wspólnych znajomych mozesz wyciągnąć poprzez podzapytanie tak jak to jest zrobione w wątku o którym wspominasz, ale możesz też to wykonać przez złączenie.

Aby wydobyć wspólnych znajomych (czyli relacja U1->znajomy U1-> U2)
  1. SELECT uf1.user_id AS 'uzytkownik1', uf1.friend_id AS 'wspolni znajomi', uf2.user_id AS 'uzytkownik2'
  2. FROM user_friend uf1 LEFT JOIN user_friend uf2 ON (uf1.friend_id = uf2.friend_id)
  3. WHERE uf1.user_id = $user1_id AND uf2.user_id = $user2_id


Aby wydobyć więcej pośrednich znajomych trzeba wykonać więcej złączeń:
  1. SELECT uf1.user_id AS 'u1', uf2.user_id AS 'znajomy u1', uf3.user_id AS 'znajomy znajomego u1', uf3.friend_id AS 'u2'
  2. FROM user_friend uf1 LEFT JOIN user_friend uf2 ON (uf1.friend_id = uf2.user_id)
  3. LEFT JOIN user_friend uf3 ON (uf2.friend_id = uf3.user_id)
  4. WHERE uf1.user_id = $user1_id AND uf3.friend_id = $user2_id


Nie wiem na ile znasz SQLa ale wyjaśnię kilka rzeczy które mogą być dla Ciebie nie zrozumiałe:
1) Poczytaj o złączeniach (JOIN ... ON)
2) " uf1.user_id AS 'u1' " - to przypisanie nazwy kolumnie (niezależnej od nazwy pola)
3) uf1 uf2 uf3 to aliasy w celu rozróżnienia które pole do której tabeli należy bo przy złączeniach zawsze trzeba to określić zwłaszcza gdy pola mają te same nazwy (co zawsze sie zadarzy gdy złączamy tabelę ze samą sobą).

Nie gwarantuje ze te zapytania odrazu zadziałają bo nie sprawdzałem ich na żadnej bazie... Ale ogólna koncepcja napewno jest dobra:) Poczytaj o złączeniach!

A tak na marginesie to nie potrzebujesz dwóch tabel typu "user_friend" możesz to spokojnie trzymać w jednej tabeli i własnie pole "type" niech określa w jakim stanie jest relacja przyjaciół i w powyższych zapytaniach w klauzuli WHERE dodaj wymóg co do wartości tego pola w każdej ze złączanych tabel.
Czyli jesli np. Type=1 określa że relacja jest "zaakceptowana przez obie strony" to musisz dodać do WHERE
  1. uf1.type=1 AND uf2.type=1 AND uf3.type=1


Powodzenia
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.