Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skomplikowane Grupowanie
Forum PHP.pl > Forum > Bazy danych > MySQL
kajtek2008
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)
sazian
nie bardzo rozumiem jakie dane chcesz uzyskać
zamiast tego Odbiorca -> Data -> Ostatnia wiadomość napisz jakie konkretnie dane chcesz uzyskać
wiiir
moze o group_concat ci chodzi
podaj jaki wynik chcesz uzyskac - prawdziwy wynik
kajtek2008
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


sazian
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.  
kajtek2008
Jesteś wielki smile.gif uf byłem blisko. Powiedz proszę długo ci to zajęło ?
sazian
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
kajtek2008
Faktycznie nie zauważyłem ze data jest typu varchar, już to poprawiłem. Jeszcze raz dzięki.
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.