gregory32
14.06.2013, 10:29:28
Buduję właśnie wiadomości przesyłane między użytkownikami. Mam w mysql tabelę, w której mam kolumny: nadawca, odbiorca, treść. Aktualnie mam takie zapytanie do bazy:
select nadawca, odbiorca, tresc from `messages` where nadawca="$zalogowanyuzytkownik" union select nadawca, odbiorca, tresc from `messages` where odbiorca="$zalogowanyuzytkownik"
I wyświetla mi wszystkie rekordy, w których nadawcą lub odbiorcą jest $zalogowanyuzytkownik. Jak zmodyfikowac to zapytanie, by wyświetlało mi po jednym rekordzie gdzie nadawcą lub odbiorcą jest $zalogowanyuzytkownik? Może wyjaśnię to na przykładzie:
w tabeli mam:
$zalogowanyuzytkownik, $innyuzytkownik1, $jakastresc1
$innyuzytkownik1, $zalogowanyuzytkownik, $jakastresc2
$innyuzytkownik2, $zalogowanyuzytkownik, $jakastresc3
$zalogowanyuzytkownik, $innyuzytkownik2, $jakastresc4
$zalogowanyuzytkownik, $innyuzytkownik3, $jakastresc5
$innyuzytkownik3, $zalogowanyuzytkownik, $jakastresc6
i chciałbym, by zapytanie wyświetliło mi tylko
$zalogowanyuzytkownik, $innyuzytkownik1, $jakastresc1
$innyuzytkownik2, $zalogowanyuzytkownik, $jakastresc3
$innyuzytkownik3, $zalogowanyuzytkownik, $jakastresc6
czyli po jednym rekordzie, gdzie występuje $zalogowanyuzytkownik i $innyuzytkownik.
Ktoś pomoże?
b4rt3kk
14.06.2013, 10:34:16
Kiepsko to wyjaśniłeś, bo nie mam zielonego pojęcia o co Ci chodzi. Piszesz o jednym rekordzie, a w przykładzie podajesz 3 rekordy.
Talidali
14.06.2013, 10:43:40
Zacznijmy od początku.
Masz tabelę
z id, sender, receiver, text, is_sender
Do bazy danych przy wysyłaniu wiadomości dodajedsz dwa rekordy. Różnią się od siebie tym że jedno w polu is_sender ma 0 a drugie 1.
dla odebranych wiadomości robisz tak select * from tabela where receiver=$sesja and is_sender = 0
dla wysłanych wiadomości select * from tabela where sender=$sesja and is_sender = 1
gregory32
14.06.2013, 10:48:21
Załączę screena:

chciałbym, by pobrało mi wszystkie rekordy gdzie wystepuje zalogowanyuzytkownik, niewazne czy nadawca czy odbiorca. i chciałbym, by drugie pole (odbiorca lub nadawca), było, nie wiem jak to ujac, niepowtarzalne, tzn by w przypadku tego zapytania pobralo mi rekordy o id 52, 51, 49, 46.
id 50 odpada, ponieważ w id 52 już wystapil innyuzytkownik3,
id 48 odpada, ponieważ w id 52 już wystapil innyuzytkownik2,
id 47 odpada, ponieważ w id 52 już wystapil innyuzytkownik2
itd..
b4rt3kk
14.06.2013, 10:59:11
Jaki jest cel takiego wyświetlania? Może to nieco pomoże zrozumieć problem. Póki co mogę jedynie zaproponować użycie GROUP BY nadawca, odbiorca. Czyli:
SELECT * FROM tabela WHERE warunki GROUP BY nadawca, odbiorca
gregory32
14.06.2013, 10:59:54
albo ujmę to jeszcze inaczej, chciałbym, by wyświetliło mi każdego użytkownika, z którym wymienial wiadomosci zalogowanyuzytkownik (nieważne czy nadawca czy odbiorca). I chodzi o to, zeby gdy wyswietli mi, ze nadawcą jest jakisuzytkownik1 a odbiorcą jest zalogowanyuzytkownik, to by nie wyświetlało już dalszych rekordów gdzie nadawcą jest jakisuzytkownik1 a odbiorcą jest zalogowanyuzytkownik lub nadawcą jest zalogowanyuzytkownik a odbiorcą jest jakisuzytkownik1.
b4rt3kk
14.06.2013, 11:02:42
Cytat(gregory32 @ 14.06.2013, 11:59:54 )

albo ujmę to jeszcze inaczej, chciałbym, by wyświetliło mi każdego użytkownika, z którym wymienial wiadomosci zalogowanyuzytkownik (nieważne czy nadawca czy odbiorca). I chodzi o to, zeby gdy wyswietli mi, ze nadawcą jest jakisuzytkownik1 a odbiorcą jest zalogowanyuzytkownik, to by nie wyświetlało już dalszych rekordów gdzie nadawcą jest jakisuzytkownik1 a odbiorcą jest zalogowanyuzytkownik lub nadawcą jest zalogowanyuzytkownik a odbiorcą jest jakisuzytkownik1.
Tak na marginesie nie jest potrzebny tutaj UNION SELECT, a jedynie dodatkowy warunek:
SELECT nadawca, odbiorca, tresc FROM messages WHERE nadawca = '$zalogowanyuzytkownik' OR odbiorca = '$zalogowanyuzytkownik' GROUP BY nadawca, odbiorca
gregory32
14.06.2013, 11:11:06
Cytat(b4rt3kk @ 14.06.2013, 11:02:42 )

Tak na marginesie nie jest potrzebny tutaj UNION SELECT, a jedynie dodatkowy warunek:
SELECT nadawca, odbiorca, tresc FROM messages WHERE nadawca = '$zalogowanyuzytkownik' OR odbiorca = '$zalogowanyuzytkownik' GROUP BY nadawca, odbiorca

nie pasuje mi to, bo na przykład jeśli wyświetla mi
innyuzytkownik1, zalogowany uzytkownik, to juz
zalogowany uzytkownik, innyuzytkownik1 nie powinno wyświetlać..
mmmmmmm
14.06.2013, 11:11:56
Masz błąd w opisie.
48 nie odpada - w 53 jest zalogowanyuzytkownik3
A zapytanie powinno wygladac mniej więcej tak:
SELECT DISTINCT t1.nadawca, t1.odbiorca FROM tabela t1 LEFT JOIN tabela t2 ON t1.id>t2.id AND t2.nadawca=t1.odbiorca WHERE t2.id IS NOT NULL
Dlatego takie skomplikowane, gdyż MySQL nie posiada EXCEPT
gregory32
14.06.2013, 11:16:12
Cytat(mmmmmmm @ 14.06.2013, 11:11:56 )

Masz błąd w opisie.
rzeczywiście jest błąd w opisie, powinno być
id 48 odpada, ponieważ w
id 49 już wystapil innyuzytkownik2,
id 47 odpada, ponieważ w
id 49 już wystapil innyuzytkownik2
Cytat(mmmmmmm @ 14.06.2013, 11:11:56 )

SELECT DISTINCT t1.nadawca, t1.odbiorca FROM tabela t1 LEFT JOIN tabela t2 ON t1.id>t2.id AND t2.nadawca=t1.odbiorca WHERE t2.id IS NOT NULL
możesz mi to wyjaśnić nieco bardziej szczegółowo, co pod co mam podstawić i co to jest t1 i t2?
mmmmmmm
14.06.2013, 12:14:55
SELECT DISTINCT t1.nadawca, t1.odbiorca FROM messages t1 LEFT JOIN messages t2 ON t1.id>t2.id AND t2.nadawca=t1.odbiorca WHERE t2.id IS NOT NULL
gregory32
14.06.2013, 13:14:54
Cytat(mmmmmmm @ 14.06.2013, 12:14:55 )

SELECT DISTINCT t1.nadawca, t1.odbiorca FROM messages t1 LEFT JOIN messages t2 ON t1.id>t2.id AND t2.nadawca=t1.odbiorca WHERE t2.id IS NOT NULL
przykro mi, nie działa tak jak bym chciał..

pierwsza linijka powinna wykluczyć piątą, a druga szóstą..
mmmmmmm
14.06.2013, 13:50:24
Kurde, za grosz inwencji.
zamień = na IN. Niestety, musisz sam rozkminić na jaki IN
gregory32
14.06.2013, 14:03:38
Cytat(mmmmmmm @ 14.06.2013, 13:50:24 )

Kurde, za grosz inwencji.
zamień = na IN. Niestety, musisz sam rozkminić na jaki IN
żaden grosz inwencji tylko po prostu nie rozumiem.. pierwszy raz sie z takim skomplikowanym zapytaniem spotykam, gdy proszę o wyjaśnienie o co chodzi, to otrzymuję gotowca z podstawionymi rzeczami. i jak mam mieć swoją inwencję, skoro dostaję gotowce?
gregory32
14.06.2013, 14:06:02
poza tym nadal wyświetla mi wszystkie rekordy, a ja chcę zdefiniować $zalogowanyuzytkownik jako cos okreslonego.