Salve,

stò creando una sorta di Forum personalizzato. Lo scenario è diviso così :

Il forum ha varie categorie; ogni categoria può contenere vari topics; ogni topic contiene 1 o più messaggi; inoltre ho una tabella dove c'è la coppia utente/topic id per tenere traccia dei topic visitati dagli utenti. Traducendo il tutto in MySql, queste sono le tabelle :

codice:
    CREATE TABLE IF NOT EXISTS `forum_categories` (
      `id` int(11) unsigned NOT NULL auto_increment,
      `title` varchar(255) NOT NULL,
      `description` varchar(255) NOT NULL,
      `date` datetime NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

    CREATE TABLE IF NOT EXISTS `forum_topics` (
      `id` int(11) unsigned NOT NULL auto_increment,
      `category_id` int(11) unsigned NOT NULL,
      `title` varchar(255) NOT NULL,
      `author` varchar(255) NOT NULL,
      `date` datetime NOT NULL,
      `view` int(11) unsigned NOT NULL default '0',
      `sticky` tinyint(11) unsigned NOT NULL default '0',
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=25 DEFAULT CHARSET=utf8;    
    
    CREATE TABLE IF NOT EXISTS `forum_messages` (
      `id` int(11) unsigned NOT NULL auto_increment,
      `topic_id` int(11) unsigned NOT NULL,
      `author` varchar(255) NOT NULL,
      `message` mediumtext NOT NULL,
      `date` datetime NOT NULL,
      `original` tinyint(11) unsigned NOT NULL default '0',
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=29 DEFAULT CHARSET=utf8;

    CREATE TABLE IF NOT EXISTS `forum_visits` (
      `id` int(11) unsigned NOT NULL auto_increment,
      `topic` int(11) unsigned NOT NULL,
      `user` varchar(255) NOT NULL,
      PRIMARY KEY  (`id`),
      UNIQUE KEY `forum_visits_unique_idx` (`topic`,`user`)
    ) ENGINE=MyISAM AUTO_INCREMENT=131 DEFAULT CHARSET=utf8;
Per ora ho scritto questa query :

codice:
    SELECT forum_categories.id, forum_categories.title, forum_categories.description, forum_categories.title, 
    COUNT(DISTINCT forum_topics.id) AS total_topics, SUM(CASE WHEN forum_messages.original=0 THEN 1 ELSE 0 END) AS total_replies, 
    forum_messages.author, MAX(forum_messages.date) AS last_message, SUM(CASE WHEN r.user IS NULL THEN 1 ELSE 0 END) to_view
    FROM forum_categories
    LEFT OUTER JOIN forum_topics ON forum_topics.category_id=forum_categories.id 
    LEFT OUTER JOIN (SELECT topic, user FROM forum_visits WHERE user='"userA') r ON forum_topics.id=r.topic
    LEFT OUTER JOIN forum_messages ON forum_messages.topic_id=forum_topics.id
    GROUP BY forum_categories.id 
    ORDER BY forum_categories.date
ma sfortunatamente non mi ritorna tutto quello che mi serve, ovvero :


1. titolo per ogni categoria; al momento funziona
2. il numero di topic per ogni categoria; al momento funziona
3. il numero, per ogni categoria, dei messaggi per ogni topic (deve però fare il conteggio solo dei messaggi in forum_messages che hanno il campo original=0); al momento funziona
4. un flag che mi dice se un determinato utente (nell'esempio userA) ha già letto il topic; da come l'ho strutturata, se è maggiore a 0 dovrà ancora leggerlo; al momento funziona
5. l'autore e la data (e quì c'è il mio problema) dell'ultimo messaggio inserito per una determinata categoria (l'ultima data me la ritorna, ma non include il corrispondente author; ne prende uno a caso);
6. avere la query più perfomante possibile;

Spero possiate darmi una mano