Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Budowa bazy przyjaciół
Forum PHP.pl > Forum > PHP
Moli
Robię w pewnm projekcie listę przyjaciół. Będzie wyświetlane imie oraz fotka przyjaciół danego profilu. Baze chciałem stworzyć tak:
Kod
USERS
ID | Imie | Photo_ID

PHOTOS
ID | file_name

FRIENDS
USER ID | FRIEND ID


Wpierw pobieram listę ID uzytkowników które odpowiadają podanym kryteriom (czyli czy uzytkownik jest czyims przyjacielem).Następnie pobieran dane użytkownika z tabeli "USERS", z pola "photo_id" pobieram wartość i pobieram z tabeli "PHOTOS" wpis o ID pobranym z pola "photo_id".

Czyli jeśli ktoś będzie miał 10 przyjaciół, będe musiał pobrać 10 profili i 10 zdjęć czyli razem 20 (+1 pobierające liste przyjaciół) zapytań.

Wychodzi trochę dużo, bo przy liczbe przyjaciół np. 500 to będzie aż 1000 zapytań. Jak lepiej zoragnizować to ?

ps. Oczywiście cache będzie ale może istnieje wydajniejsze wyjście.
dr_bonzo
a JOINy?

  1. SELECT u.imie, u.id, p.filename FROM users u, friends f, photos p WHERE f.user_id = $id_usera_ktorego_przegladasz AND u.id = f.friend_id AND p.id = u.photo_id


znajduszesz friendsow gdzie user id jest id tego usera ktorego przegladasz
dolaczasz info o userach (przyjaciol)
i dolaczasz tabele ze zdjeciami do userow
Moli
O kurde, zupelnie o tym zapomniałem smile.gif Dzięki wielkie :]
phpion
Cytat(Moli @ 26.01.2008, 16:00:15 ) *
Kod
USERS
ID | Imie | Photo_ID

PHOTOS
ID | file_name

FRIENDS
USER ID | FRIEND ID

Moim zdaniem masz błąd w strukturze baz danych. Rozumiem, że danemu userowi odpowiada 1 fotka w tabeli photos. W takim razie po co rozbijałeś to na 2 tabele? Wg mnie lepiej (poprawniej) będzie tak:
Kod
USERS
ID | Imie | file_name

FRIENDS
USER ID | FRIEND ID

Teraz trzeba napisać odpowiednie zapytanie SQL, które nie powinno być problemem. Jest tu tylko 1 pułapka: trzeba sprawdzić zarówno pole user_id oraz friend_id (co przeoczył ~dr_bonzo) bo przecież jeśli ktoś zna mnie to zazwyczaj i ja jego znam smile.gif Całość wyglądałaby mniej-więcej tak:
  1. SELECT DISTINCT u.id, u.imie, u.file_name FROM friends f LEFT JOIN users u ON (f.user_id=u.id XOR f.friend_id=u.id) ORDER BY u.imie;

DISTINCT aby usunąć ewentualne duble danych.
Moli
Każdy użytkownik może mieć wiele fotek, nie chodzi mi o avatar o swoje fotki smile.gif
Cytat
bo przecież jeśli ktoś zna mnie to zazwyczaj i ja jego znam

Właśnie też o tym pomyślałem, dzięki temu będzie o połowę mniej wpisów w tabli smile.gif
phpion
Cytat(Moli @ 26.01.2008, 16:27:46 ) *
Każdy użytkownik może mieć wiele fotek, nie chodzi mi o avatar o swoje fotki smile.gif

No to muszę Cię zmartwić ale na Twojej obecnej strukturze również tego nie wykonasz:
Kod
USERS
ID | Imie | Photo_ID

PHOTOS
ID | file_name

W jaki sposób chcesz dodać drugie zdjęcie? Gdzie wstawisz ID drugiego zdjęcia? Potrzebujesz w takim razie jeszcze jedną tabelę:
Kod
user_photos: user_id, photo_id

gdzie oba pola łącznie będą stanowić klucz główny, a każde z nich będzie kluczem obcym do odpowiedniej tabeli.
b_chmura
off topic: phpion i to się nazywają awatary! xD
Moli
@phpion - Tabela ze zdjęciami wygląda dokladnie tak
Kod
ID | USERID | ALBUMID | FILENAME

Więc jak widzisz można ustawić kilka fotek dla 1 użytkownika smile.gif Nie napisałem jak wygląda cała baza, bo reszta pól nie byla mi potrzebna do tego zapytania smile.gif

ps. Może komuś się przyda, zapytanie jest takie
  1. SELECT DISTINCT u.id, u.login, u.name, u.description, u.main_photo, p.filename FROM photos p , friends f LEFT JOIN users u ON (f.uid=u.id XOR f.fid=u.id) WHERE (f.uid=' . $id . ' XOR f.fid=' . $id . ') AND ( p.id = u.main_photo ) AND ( u.id <> ' . $id . ' ) ORDER BY u.id LIMIT 10


Jednak jest pewien błąd w tym zapytaniu. Jesli bede mial 2 uzytkownikow, jeden o ID = 1 a drugi o ID = 2 i w bazie bedzie wpis
Kod
UDI | FID
1 | 2

To dla użytkownika ID = 1 znajdzie przyjaciela (czyli ID=2), ale już dla użytkownika ID = 2 nie znajdzie nic. Chociaż powinno.

Wie ktoś jaki błąd jest w zapytaniu ? Nie mogę do tego dojść.
defrag
Cytat(Moli @ 2.02.2008, 10:36:42 ) *
@phpion - Tabela ze zdjęciami wygląda dokladnie tak
Kod
ID | USERID | ALBUMID | FILENAME

Więc jak widzisz można ustawić kilka fotek dla 1 użytkownika smile.gif Nie napisałem jak wygląda cała baza, bo reszta pól nie byla mi potrzebna do tego zapytania smile.gif

ps. Może komuś się przyda, zapytanie jest takie
  1. SELECT DISTINCT u.id, u.login, u.name, u.description, u.main_photo, p.filename FROM photos p , friends f LEFT JOIN users u ON (f.uid=u.id XOR f.fid=u.id) WHERE (f.uid=' . $id . ' XOR f.fid=' . $id . ') AND ( p.id = u.main_photo ) AND ( u.id <> ' . $id . ' ) ORDER BY u.id LIMIT 10


Jednak jest pewien błąd w tym zapytaniu. Jesli bede mial 2 uzytkownikow, jeden o ID = 1 a drugi o ID = 2 i w bazie bedzie wpis
Kod
UDI | FID
1 | 2

To dla użytkownika ID = 1 znajdzie przyjaciela (czyli ID=2), ale już dla użytkownika ID = 2 nie znajdzie nic. Chociaż powinno.

Wie ktoś jaki błąd jest w zapytaniu ? Nie mogę do tego dojść.

Wpisuj do bazy dane o przyjaciolach 2 razy, uwierz mi ze lepiej trzymac sie prostoty, wiec dla usera 1 i 2 robisz dwa rekordy
  1. UDI | FID
  2. 1 2
  3. 2 1

Poza tym dobrze do tabeli users2friends dodac timestamy dla send_at, accepted_at i rejected at jesli chcesz wysylac zaproszenia smile.gif
Moli
Wiem w czym był błąd.
  1. AND ( p.id = u.main_photo )

Przez ten kawałek. Jeśli użytkownik nie miał ustawionego głównego zdjęcia to nie znajdywało go. Po rejestracji lub jeśli uzytkownik nie ustawi głównego zdjęcia, wartośc pola main_photo w tabeli users wynosi 0. Myślę że musze w zapytaniu użyć if. Jeśli u.main_photo <> 0 to dopiero wykonuje p.id = u.main_photo. NIestety nie mogę znaleść jak to zrobić, a w manualu mysql, jest to słabo opisane. Wie ktoś jak używać if w mysql ?

ps. Zapytanie wygląda teraz tak
  1. SELECT DISTINCT u.id, u.login, u.name, u.description, u.main_photo, p.filename FROM photos p , friends f LEFT JOIN users u ON (f.uid=u.id OR f.fid=u.id) WHERE (f.uid=' . $id . ' OR f.fid=' . $id . ') AND ( u.id <> ' . $id . ')
defrag
Cytat(Moli @ 2.02.2008, 11:49:30 ) *
Wiem w czym był błąd.
  1. AND ( p.id = u.main_photo )

Przez ten kawałek. Jeśli użytkownik nie miał ustawionego głównego zdjęcia to nie znajdywało go. Po rejestracji lub jeśli uzytkownik nie ustawi głównego zdjęcia, wartośc pola main_photo w tabeli users wynosi 0. Myślę że musze w zapytaniu użyć if. Jeśli u.main_photo <> 0 to dopiero wykonuje p.id = u.main_photo. NIestety nie mogę znaleść jak to zrobić, a w manualu mysql, jest to słabo opisane. Wie ktoś jak używać if w mysql ?

ps. Zapytanie wygląda teraz tak
  1. SELECT DISTINCT u.id, u.login, u.name, u.description, u.main_photo, p.filename FROM photos p , friends f LEFT JOIN users u ON (f.uid=u.id OR f.fid=u.id) WHERE (f.uid=' . $id . ' OR f.fid=' . $id . ') AND ( u.id <> ' . $id . ')

Ale tu wystarczy left join na p.id = u.main_photo i jak bedzie mial fotke to zwroci jej pola a jak nie nulle
Moli
No miałeś racje smile.gif Dzięki za pomoc.
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.