Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Skomplikowane Grupowanie, nadawca->odbiorca ; odbiorca->nadawca = połaczenie
kajtek2008
post
Post #1





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 15.08.2009
Skąd: Nowy Sącz

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


Może w tym dziale otrzymam pomoc dot. grupowania


  1. CREATE TABLE IF NOT EXISTS `message` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `message` text NOT NULL,
  4. `sender` varchar(30) NOT NULL,
  5. `odbiorca` varchar(255) NOT NULL,
  6. `date` varchar(255) NOT NULL,
  7. `status` int(11) NOT NULL,
  8. PRIMARY KEY (`id`)
  9. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=341 ;
  10.  
  11. INSERT INTO `message` (`id`, `message`, `sender`, `odbiorca`, `date`, `status`) VALUES
  12.  
  13. (1, 'adsd', 'poin', 'tek', '1348333394', 0),
  14. (2, 'tetea', 'poin', 'tek', '1348333508', 0),
  15. (3, 'khjkhkh', 'poin', 'tek', '1348333532', 0),
  16. (4, 'hkhkh', 'tek', 'poin', '1348333545', 0),
  17. (5, 'jhgjg', 'tek', 'poin', '1348333561', 0),
  18. (6, 'vdgfd', 'poin', 'tek', '1348333569', 0),
  19. (7, 'fds', 'tek', 'admin', '1356271677', 1),
  20. (8, 'gfgdfgdfggd', 'tek', 'admin', '1356271680', 1),
  21. (9, 'fa', 'tek', 'Fre', '1356294621', 1),


Jak widać Użytkownik raz jest sender a raz jest odbiorca

Z tych oto danych muszę otrzymać taki wynik
Odbiorca -> Data -> Ostatnia wiadomość

Bez duplikatów


Próbowałem to na wiele sposobów, również pomagał mi profesor ze studiów niestety nie wymyśliliśmy odpowiedniego zapytania.

(poprzedni temat w dziale php Temat: Grupowanie 2 kolum)

Ten post edytował kajtek2008 5.01.2013, 17:03:24
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
sazian
post
Post #2





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


nie bardzo rozumiem jakie dane chcesz uzyskać
zamiast tego Odbiorca -> Data -> Ostatnia wiadomość napisz jakie konkretnie dane chcesz uzyskać
Go to the top of the page
+Quote Post
wiiir
post
Post #3





Grupa: Zarejestrowani
Postów: 260
Pomógł: 34
Dołączył: 22.02.2010

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


moze o group_concat ci chodzi
podaj jaki wynik chcesz uzyskac - prawdziwy wynik
Go to the top of the page
+Quote Post
kajtek2008
post
Post #4





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 15.08.2009
Skąd: Nowy Sącz

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


Po zalogowaniu się użytkownik o nazwie tek powinien otrzymać takie dane


odbiorca | data | wiadomosc

poin -> 1348333394 -> vdgfd
admin -> 1348333569 -> gfgdfgdfggd
Fre -> 1356294621 -> fa


Chyba dobrze to rozpisałem

chodzi oto by w polu
Odbiorca był login osoby z którą piszemy
Data była najnowsza, ostatniej napisanej wiadomości
Message ostatnia wiadomość jaka była wysłana w korespondencji sender -> odbiorca | odbiorca -> sender

@edit
  1. $username = tek



  1. SELECT `sender`, `message`, `date`, `status`, `odbiorca`
  2. FROM `message`
  3. WHERE (sender = '$username' OR odbiorca = '$username')
  4. GROUP BY odbiorca, sender
  5. ORDER BY `date` DESC"


W takim przypadku jest problem dubla powtarzają się rekordy dla wysyłającego i dla odbierającego

tzn np

poin->tek -> 1348333394 -> vdgfd -> odbiorca
tek->poin -> 1348333561 -> jhgjg -> wysyłający


Inaczej jeszcze

  1. SELECT m1.sender,m1.odbiorca, m1.date,m1.message
  2. FROM message m1 INNER JOIN message m2 ON m1.sender=m2.odbiorca
  3. WHERE m1.sender='$username'
  4. GROUP BY m1.sender,m1.odbiorca ORDER BY m1.date


  1. SELECT * FROM `message` WHERE `sender` = '$username' GROUP BY sender
  2. UNION
  3. SELECT * FROM `message` WHERE `odbiorca` = '$username' GROUP BY odbiorca




Ten post edytował kajtek2008 5.01.2013, 16:58:30
Go to the top of the page
+Quote Post
sazian
post
Post #5





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


a tak
  1. SELECT
  2. m1.id,m1.sender,m1.odbiorca,m1.date,m1.message
  3. FROM message m1
  4. WHERE
  5. 'tek' IN (m1.sender,m1.odbiorca)
  6. AND date=(SELECT max(date)
  7. FROM message m2
  8. WHERE
  9. m2.sender IN (m1.sender,m1.odbiorca)
  10. AND m2.odbiorca IN (m1.sender,m1.odbiorca)
  11. )
  12.  
  13.  
Go to the top of the page
+Quote Post
kajtek2008
post
Post #6





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 15.08.2009
Skąd: Nowy Sącz

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


Jesteś wielki smile.gif uf byłem blisko. Powiedz proszę długo ci to zajęło ?
Go to the top of the page
+Quote Post
sazian
post
Post #7





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


trudno powiedzieć, myślę że nie więcej niż pięć minut
ogólnie cały problem rozwiązuje podzapytanie wyszukujące maksymalną datę

a tak już trochę odbiegając od tematu to jeśli chcesz przechowywać datę w formacie unixowym to lepiej dać jako typ danych int, zaoszczędzisz sporo miejsca.
Jako CHARSET daj latin2(czyli iso-8859-2) lub utf8 bo będziesz miał problemy z polskimi znakami
Go to the top of the page
+Quote Post
kajtek2008
post
Post #8





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 15.08.2009
Skąd: Nowy Sącz

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


Faktycznie nie zauważyłem ze data jest typu varchar, już to poprawiłem. Jeszcze raz dzięki.
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 Aktualny czas: 22.08.2025 - 01:45