Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP] Aktywność użytkownika oraz jego znajomych, problem z wyciąganiem z bazy
Natalka
post 30.06.2012, 19:33:55
Post #1





Grupa: Zarejestrowani
Postów: 59
Pomógł: 6
Dołączył: 28.10.2009
Skąd: że znowu...

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
MattY
post 30.06.2012, 22:38:12
Post #2





Grupa: Zarejestrowani
Postów: 19
Pomógł: 1
Dołączył: 18.04.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Natalka
post 1.07.2012, 00:58:49
Post #3





Grupa: Zarejestrowani
Postów: 59
Pomógł: 6
Dołączył: 28.10.2009
Skąd: że znowu...

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 18.07.2025 - 23:58