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 :
Per ora ho scritto questa query :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;
ma sfortunatamente non mi ritorna tutto quello che mi serve, ovvero :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
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![]()

Rispondi quotando
) ma cominciamo per ordine
