Posiadam coś takiego jak:
- grupy
- id
- nazwa
- debaty (należą do grup)
- id
- id_grupy
- nazwa
- wpisy (należą do debat)
- id
- id_debaty
- treść
- data
Poniżej umieszczam zrzut bazy danych:
CREATE DATABASE IF NOT EXISTS `test_lastentry` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; USE `test_lastentry`; CREATE TABLE `groups` ( `group_id` tinyint(1) UNSIGNED NOT NULL, `name` varchar(65) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `debates` ( `debate_id` smallint(2) UNSIGNED NOT NULL, `group_fk` tinyint(1) UNSIGNED NOT NULL, `name` varchar(65) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `entries` ( `entry_id` smallint(2) UNSIGNED NOT NULL, `debate_fk` smallint(2) UNSIGNED NOT NULL, `content` varchar(65) NOT NULL, `date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `groups` (`group_id`, `name`) VALUES (1, 'group_one'), (2, 'group_second'), (3, 'group_third'); INSERT INTO `debates` (`debate_id`, `group_fk`, `name`) VALUES (1, 1, 'debate 1 for group 1'), (2, 2, 'debate 1 for group 2'), (3, 2, 'debate 2 for group 2'), (4, 2, 'debate 3 for group 2'), (5, 3, 'debate 1 for group 3'), (6, 3, 'debate 2 for group 3'); INSERT INTO `entries` (`entry_id`, `debate_fk`, `content`, `date`) VALUES (1, 1, 'entry 1 for debate 1', '2017-03-12 03:12:23'), (2, 1, 'entry 2 for debate 1', '2017-03-13 03:15:18'), (3, 2, 'entry 1 for debate 2', '2017-03-13 06:40:20'), (4, 2, 'entry 2 for debate 2', '2017-03-14 09:15:24'), (5, 3, 'entry 1 for debate 3', '2017-03-12 02:12:05'), (6, 3, 'entry 2 for debate 3', '2017-03-13 13:47:52'), (7, 3, 'entry 3 for debate 3', '2017-03-15 14:15:15'), (8, 4, 'entry 1 for debate 4', '2017-03-15 14:15:15'), (9, 5, 'entry 1 for debate 5', '2017-03-11 08:11:39'), (10, 5, 'entry 2 for debate 5', '2017-03-12 16:22:18'), (11, 6, 'entry 1 for debate 6', '2017-03-14 09:15:24'); ALTER TABLE `groups` ADD PRIMARY KEY (`group_id`); ALTER TABLE `debates` ADD PRIMARY KEY (`debate_id`); ALTER TABLE `entries` ADD PRIMARY KEY (`entry_id`); ALTER TABLE `groups` MODIFY `group_id` tinyint(1) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; ALTER TABLE `debates` MODIFY `debate_id` smallint(2) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=13; ALTER TABLE `entries` MODIFY `entry_id` smallint(2) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=12;
A tutaj zobrazowane dane:

GROUP - grupa
D - "debates" - debaty
E - "entries" - wpisy
last (X) - ostatni wpis w debacie (o czasie X)
Najpierw sprawa jest w miarę prosta.
Utworzyłem sobie listę "debat" wraz z danymi dot. ostatniego wpisu i wygląda to następująco:
SELECT `d`.`debate_id`, `d`.`name`, `last_e`.* FROM `debates` AS `d` LEFT JOIN ( SELECT `e`.`debate_fk`, `e`.`entry_id`, `e`.`content`, `e`.`date` FROM `entries` AS `e` INNER JOIN ( SELECT `debate_fk`, MAX(`date`) AS `date` FROM `entries` GROUP BY `debate_fk` ) AS `last_e_pd` ON ( (`last_e_pd`.`debate_fk` = `e`.`debate_fk`) AND (`last_e_pd`.`date` = `e`.`date`) ) ) AS `last_e` ON (`last_e`.`debate_fk` = `d`.`debate_id`)
Dałoby się jakąś to uprościć? Jakieś uwagi?
Cóż chciałbym osiągnąć? Chciałbym pobrać listę grup (a nie dabat) wraz z danymi dot. ostatniego wpisu (i dot. debaty do której wpis ten należy) w grupie...
Czyli identyfikator i nazwę grupy, identyfikator, treść i datę ostatniego wpisu oraz identyfikator i nazwa debaty.
Przy liście z "debatami" sprawa była prosta o tyle, że pobierałem najwyższą wartość (date) i grupowałem wg. id debaty - tutaj otrzymywałem wymagany wynik.
Jeśli chciałbym do wpisów dołączyć tabelę debat (aby otrzymać z nich fk grupy), to grupując wg fk grupy nie otrzymam pożądanych wyników, ponieważ zgadzać będzie się id grupy, data ostatniego wpisu, ale id debaty zostanie wzięte pierwsze z brzegu (i nie będzie zgodny z oczekiwaniami... eh, gdyby tylko ten "MAX" wybierał cały wiersz a nie tylko komórkę).
Posiadając id grupy i datę ostatniego wpisu, nie mogę do tego dołączyć wpisów (co mógłbym zrobić tylko na podstawie daty), ponieważ jeśli wpisy z różnych debat będą mieć identyczny czas (mało prawdopodobne, ale jednak), to wynik będzie nieprawidłowy.
Czy ktoś borykał się z podobnym problemem? Miałby ktoś jakieś pomysły?
Proszę o pomoc.