Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] 'Specyficzne' wyświetlanie rekordów
Forum PHP.pl > Forum > Przedszkole
gregory32
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
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
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
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
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:

  1. SELECT * FROM tabela WHERE warunki GROUP BY nadawca, odbiorca
gregory32
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
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:
  1. SELECT nadawca, odbiorca, tresc FROM messages WHERE nadawca = '$zalogowanyuzytkownik' OR odbiorca = '$zalogowanyuzytkownik' GROUP BY nadawca, odbiorca
gregory32
Cytat(b4rt3kk @ 14.06.2013, 11:02:42 ) *
Tak na marginesie nie jest potrzebny tutaj UNION SELECT, a jedynie dodatkowy warunek:
  1. 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
Masz błąd w opisie.
48 nie odpada - w 53 jest zalogowanyuzytkownik3
A zapytanie powinno wygladac mniej więcej tak:
  1. 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 smile.gif
gregory32
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
  1. 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
Cytat(mmmmmmm @ 14.06.2013, 12:14:55 ) *
  1. 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
Kurde, za grosz inwencji.
zamień = na IN. Niestety, musisz sam rozkminić na jaki IN
gregory32
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? smile.gif
gregory32
poza tym nadal wyświetla mi wszystkie rekordy, a ja chcę zdefiniować $zalogowanyuzytkownik jako cos okreslonego.
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.