Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Aktywność użytkownika oraz jego znajomych
Forum PHP.pl > Forum > Przedszkole
Natalka
Witam wszystkich smile.gif

Zasiedziałam się właśnie nad jednym problemem, z którym nie potrafię sobie poradzić, chodzi o wyciąganie danych z bazy.

Tworzę w swoim nowym serwisie dział z aktywnością, działać ma w taki sposób że w momencie gdy dodaję zdjęcie zapisuje się moja aktywność w bazie danych, jeżeli ktoś obserwuje mnie, pojawi mu się ta aktywność. To samo tyczy się innych akcji i tutaj jest problem by połączyć wszystkie akcje w jednym zapytaniu i wyświetlać całą aktywność.

Tak wygląda moja baza danych w chwili obecnej:




Na obrazku zademonstrowałam jakie dane zapisywane są w bazie danych, kogo tam numer id się znajduje.


----------------------------

Na chwile obecną wyświetlam aktywność która skierowana jest od znajomych (czyli aktywności znajomych) takim zapytaniem :

Kod
SELECT activites.* FROM PROFILE_activites AS activites INNER JOIN PROFILE_friend AS friend ON activites.idFrom = friend.user WHERE friend.myId = '$id' ORDER by activites.addDate DESC LIMIT 10


Gdzie $id - to id osoby która przegląda aktywność, ponieważ u niech chcę to wyświetlić. To zapytanie zwraca mi wszystko w bardzo fajny sposób, wyświetla mi się aktywność znajomych, ale nie wyświetla się nic co skierowane jest tylko do mnie.

Czyli nie dostaję nic gdzie idTo = moje id . I tutaj nie wiem w jaki sposób połączyć te dwa zapytania

Dane skierowane do mnie mogę wyciągnąć zapytaniem

Kod
SELECT activites.* FROM PROFILE_activites AS activites WHERE activites.idTo = '$id' ORDER by activites.addDate DESC LIMIT 10



------------------------------

Niestety wiem że problemem jest samo zapytanie, a ja jeszcze nie mam aż tak dużego doświadczenia by samemu dojść do tego w jaki sposób to połączyć, czytałam na stackoverflow, porównywałam próbowałam coś dodać, ale szczerze przyznam że słabo rozumiem INNER, RIGHT JOIN, LEFT JOIN dlatego nic z tego nie wychodzi.

Sama myślałam że wyciągne to takim zapytaniem :

Kod
SELECT activites.* FROM PROFILE_activites AS activites INNER JOIN PROFILE_friend AS friend ON activites.idFrom = friend.user WHERE friend.myId = '$id' OR (activites.idTo = '$id') ORDER by activites.addDate DESC LIMIT 10


Ale dostaję bardzo długą listę, aktywności która się powtarza.


Wiem że to nie łatwe i nie każdy będzie chciał poświęcić czas na to by mi pomóc, ale jeżeli znajdzie się jedna osoba chętna do pomocy będę ogromnie wdzięczna smile.gif
Z góry naprawdę dziękuję za same chęci, nie traktujcie mnie ulgowo, jeżeli mogę coś zmienić to proszę o informację sama dopiero się uczę.


Jeżeli coś źle wytłumaczyłam, a jest to możliwę, to proszę o informację chętnie wyjaśnię szczegółowo.
MattY
Witam

Użyj UNION w ten sposób:
  1. SELECT activites.* FROM PROFILE_activites AS activites INNER JOIN PROFILE_friend AS friend ON activites.idFrom = friend.user WHERE friend.myId = '$id'
  2. UNION
  3. SELECT activites.* FROM PROFILE_activites AS activites WHERE activites.idTo = '$id'
  4. ORDER BY addDate DESC


W ten sposób rekordy nie powtarzają się jeśli wpadają do pierwszej i drugiej połówki zapytania jednocześnie (np. obserwowany przeze mnie staje się moim znajomym - dotyczy obserwowanego i mnie więc spełnia warunek w linii przed słowem UNION i w tej linii po nim). Jeżeli jednak chciałabyć, aby takie zdarzenia się powtarzały to "UNION ALL".

pozdr.
Mateusz
Natalka
Zaraz będę próbowała więc dam znać, szczerze przyznam że o Union select zapomniałam, bardzo dawno temu gdy kombinowałam ze sql injection to coś przerabiałam, ale już zapomniałam o wszystkim tongue.gif

Cytat(MattY @ 30.06.2012, 23:38:12 ) *
Witam

Użyj UNION w ten sposób:
  1. SELECT activites.* FROM PROFILE_activites AS activites INNER JOIN PROFILE_friend AS friend ON activites.idFrom = friend.user WHERE friend.myId = '$id'
  2. UNION
  3. SELECT activites.* FROM PROFILE_activites AS activites WHERE activites.idTo = '$id'
  4. ORDER BY addDate DESC


W ten sposób rekordy nie powtarzają się jeśli wpadają do pierwszej i drugiej połówki zapytania jednocześnie (np. obserwowany przeze mnie staje się moim znajomym - dotyczy obserwowanego i mnie więc spełnia warunek w linii przed słowem UNION i w tej linii po nim). Jeżeli jednak chciałabyć, aby takie zdarzenia się powtarzały to "UNION ALL".

pozdr.
Mateusz



Bardzo Ci dziękuję za pomoc, to naprawdę pomogo, troszkę zmieniłam zapytania i dostaję wszystko co chciałam.
Mam naukę na całe życie i drugi raz już na pewno nie popełnię tego błędu. UNION SELECT zapamiętam sobie już do końca życia.

Jestem Ci ogromnie wdzięczna, jeszcze raz dziękuje smile.gif
Natalia
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.