Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] 'Specyficzne' wyświetlanie rekordów
-gregory32-
post
Post #1





Goście







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?
Go to the top of the page
+Quote Post
b4rt3kk
post
Post #2





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

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


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.
Go to the top of the page
+Quote Post
Talidali
post
Post #3





Grupa: Zarejestrowani
Postów: 79
Pomógł: 19
Dołączył: 31.05.2013

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


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





Goście







Załączę screena:
(IMG:http://pics.tinypic.pl/i/00401/w1cehciv4kry.png)

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..
Go to the top of the page
+Quote Post
b4rt3kk
post
Post #5





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

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


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





Goście







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





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

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


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


Ten post edytował b4rt3kk 14.06.2013, 11:03:24
Go to the top of the page
+Quote Post
-gregory32-
post
Post #8





Goście







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


(IMG:http://pics.tinypic.pl/i/00401/8ibuw27xeziq.png)

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ć..
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #9





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
-gregory32-
post
Post #10





Goście







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?
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #11





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


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





Goście







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ł..
(IMG:http://pics.tinypic.pl/i/00401/063lm6ij5cus.png)
pierwsza linijka powinna wykluczyć piątą, a druga szóstą..
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #13





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Kurde, za grosz inwencji.
zamień = na IN. Niestety, musisz sam rozkminić na jaki IN
Go to the top of the page
+Quote Post
-gregory32-
post
Post #14





Goście







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? (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
-gregory32-
post
Post #15





Goście







poza tym nadal wyświetla mi wszystkie rekordy, a ja chcę zdefiniować $zalogowanyuzytkownik jako cos okreslonego.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 25.12.2025 - 10:51