Używam CakePHP i staram się napisać czat w stylu facebook`owego.
Wyjaśnie o co dokładnie mi chodzi:
Posiadam tabele messages z kolumnami
- id
- message
- user_from
- user_to
-date
Oraz tabela uzytkowników (users) z kolumnami
-id
-username
-name
-surname
-password
- itd

No i teraz powiedzmy że jestem zalogowany jako użytkownik o id 1 i wchodze do skrzynki wiadomości.
Chciałbym tu widzieć tylko po 1 NAJNOWSZEJ wiadomości w której jestem nadawcą bądź odbiorcą.
Czyli tak jak jest np w skrzynce gmaila, że widizmy ostatnią wiadomość z jakimś użytkownikiem i możemy w nią wejść żeby zobaczyć więcej...
Sprawia mi to nie lada problem, udało mi się dojść do wybrania wiadomości i zgrupowania ich po user_from i user_to, ale problem w tym ze wybiera on wiadomosci z najmniejszym id... czyli pierwsze napisane... A chciałbym żeby wybrał mi najnowsze
Oto zapytanie które prawie rozwiązało mój problem:
SELECT `Message`.`id`, `Message`.`user_from`, `Message`.`user_to`, `Message`.`message`, `Message`.`date`, `UserFrom`.`id`, `UserFrom`.`username`, `UserFrom`.`email`, `UserFrom`.`password`, `UserFrom`.`name`, `UserFrom`.`surname`, `UserFrom`.`city`, `UserFrom`.`street`, `UserFrom`.`born_date`, `UserFrom`.`role`, `UserTo`.`id`, `UserTo`.`username`, `UserTo`.`email`, `UserTo`.`password`, `UserTo`.`name`, `UserTo`.`surname`, `UserTo`.`city`, `UserTo`.`street`, `UserTo`.`born_date`, `UserTo`.`role` FROM `gametrade_cake`.`messages` AS `Message` LEFT JOIN `gametrade_cake`.`users` AS `UserFrom` ON (`Message`.`user_from` = `UserFrom`.`id`) LEFT JOIN `gametrade_cake`.`users` AS `UserTo` ON (`Message`.`user_to` = `UserTo`.`id`) WHERE ((`user_to` = 1) OR (`user_from` = 1)) GROUP BY UserTo.id, UserFrom.id ORDER BY `Message`.`date` DESC, `Message`.`id` DESC
Niestety tak jak wspomniałem nie sortuje mi po id DESC tylko robi ASC... Order wogole nie ma na to wpływu..
Drugim problemem jest to że w sumie wybiera 2 ostatnie wiadomości od nadawcy i odbiorcy (dlatego ze wybiera po user_from i user_to), dużo fajniej było by gdyby wybierało tylko 1 ostatnią z najwiekszym id bądź datą...
Wyeliminuje to późniejszy problem przy stronicowaniu.
Zrzuty struktury z mojej bazy, gdyby ktoś miał ochotę sie pobawić.
CREATE TABLE IF NOT EXISTS `messages` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_from` int(11) NOT NULL, `user_to` int(11) NOT NULL, `message` text NOT NULL, `date` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;
CREATE TABLE IF NOT EXISTS `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(64) NOT NULL, `email` varchar(128) NOT NULL, `password` varchar(64) NOT NULL, `name` varchar(32) NOT NULL, `surname` varchar(32) NOT NULL, `city` varchar(64) NOT NULL, `street` varchar(64) NOT NULL, `born_date` date NOT NULL, `role` varchar(32) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;