Pobieranie znajomych online

0

Witam

Napisałem sobie skrypt na listę znajomych usuwanie, akceptacje i wyświetlanie..

Lecz borykam się jak użyć left join by pobrać znajomych w statusie online.

Tabela:
users
-id
-nickname
-time_active (time() + 15 minut)
friends
-id
-id_zaprasza (ktoś kogoś zaprasza)
-id_zapraszany (tego kogoś zaprasza)

Tworzę sobie SELECT id FROM friends WHERE id_zapasza = :mojeid OR id_zapraszany = :mojeid i tutaj myślałem nad pętlą users i poszukiwaniu time_activ ale lepsze rozwiązanie to left join choć nwm za bardzo jak w tym przypadku go użyć.

Co chce osiągnąć?:
Pobrać liczbę przyjaciół aktywnych czyli jeśli time() nie wyprzedził time_active to user aktywny. A z friends pobrać kogo mam.

Próbowałem tak:

 SELECT * 
FROM friends
INNER JOIN users
WHERE (
friends.id_zaprasza = :moje_id
OR friends.id_zapraszany = :moje_id
)
AND friends.STATUS =1
AND users.time_active > :time
LIMIT 0 , 30

Ale wciąż to nie to..

1

1 - Staraj się nie korzystać z *, z tego co wiem bardzo wolno się wykonuje
2 -

 SELECT users.nickname
FROM friends
INNER JOIN users 
ON (friends.id_zaprasza = :moje_id OR friends.id_zapraszany = :moje_id) AND users.time_active < time()
WHERE ...

Nie mam gdzie przetestować ale na pewno przy JOIN korzystało się z ON z nie WHERE
Edit. Nie jestem też pewnien czy time.active powinno się dac w Where czy w On, spróbuj obie wersje

0

wiem dzięki ale chce by to działało tylko..

SELECT users.username
FROM friends
INNER JOIN users ON ( friends.id_zaprasza =1
OR friends.id_zapraszany =1 ) 
AND users.time_activ < NOW( ) 
AND friends.status = 1
LIMIT 0 , 30

poprawne zapytanie lecz zwracami wszystkich userow: admin, test, test 2
a w znajomych mam tylko jednego zaakceptowanego..

baze możesz zobaczyć tu: http://sqlfiddle.com/#!8/2fab6/1

1
SELECT users.username
FROM friends
LEFT JOIN users ON friends.id_zaprasza=users.id OR friends.id_zapraszany=users.id
WHERE (friends.id_zaprasza = 1 OR friends.id_zapraszany=1)
AND users.time_activ < NOW()
AND users.id <> 1
AND friends.status=1

Działa na pewno dobrze

BTW. Fajna ta stronka :]
zmień sobie time_active na jaki potrzebujesz, np. time_avtive >= NOW()-15minut

0

Dzięki kolego :)

tylko

 SELECT users.username
FROM friends
LEFT JOIN users ON friends.id_zaprasza=users.id OR friends.id_zapraszany=users.id
WHERE (friends.id_zaprasza = :id OR friends.id_zapraszany=:id)
AND users.time_activ > NOW()
AND users.id <> :id
AND friends.STATUS=1

te <> oznacza żeby mojego id nie podliczało ?:)

I co do :

users.time_activ > NOW()

W tej tabeli już mam +15. Więc czemu nie chce mi pokazać tylko userów którzy mają większy czas ?

0

Dobra już działa :)

Wielkie dzięki kolego :)

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