Newsgroup: it.comp.www.php
Titolo: Mysql non esegue quello che gli dico

Buongiorno a tutti,
volevo chiedervi una cosa molto velocemente che però non riesco a
capire e non so dove andare a parare.
Vi spiego il mio problema: ho un database e utilizzo come DBMS mysql
5.0
Io vorrei selezionare l'id di ogni discussione con l'id dell'utente
che ha inserito l'ultimo messaggio e la data dell'inserimento
dell'ultimo messaggio; inserendo questa query non eseguo quello che
voglio:
SELECT username AS last_user, id_discussione, max( data_creaz_mess )
AS last_msg
       FROM messaggio NATURAL JOIN atleta
       GROUP BY id_discussione
vi posto i dati per creare il database:
CREATE DATABASE prova;
USE prova;
CREATE TABLE `atleta` (
  `id_user` int(8) NOT NULL auto_increment,
  `username` varchar(25) NOT NULL,
  PRIMARY KEY  (`id_user`)
) ;
INSERT INTO `atleta`  VALUES
(1, 'loschizzato'),
(2, 'Teo'),
(3, 'lex85'),
(4, 'barbarella'),
(5, 'oi'),
(6, 'kl');
CREATE TABLE `messaggio` (
  `id_messaggio` int(8) NOT NULL auto_increment,
  `id_user` int(8) NOT NULL,
  `id_discussione` int(8) NOT NULL,
  `data_creaz_mess` datetime NOT NULL,
  `testo_messaggio` text NOT NULL,
  PRIMARY KEY  (`id_messaggio`)
);
INSERT INTO `messaggio` (`id_messaggio`, `id_user`, `id_discussione`,
`data_creaz_mess`, `testo_messaggio`) VALUES
(7, 1, 1, '2007-01-30 22:13:58',
'sssssssssssssssssssssssssssssssssssssssssssssssssssssadsaaaaaaa'),
(9, 1, 1, '2007-01-31 23:09:35', 'we\r\n'),
(10, 1, 1, '2007-01-31 23:09:38', 'ds'),
(11, 1, 1, '2007-01-31 23:09:39', 'fgh'),
(12, 1, 1, '2007-01-31 23:09:41', 'hgfdhg'),
(13, 1, 1, '2007-01-31 23:09:42', 'fhddfh'),
(14, 1, 1, '2007-01-31 23:09:44', 'fdhgdfhg'),
(15, 1, 1, '2007-01-31 23:09:45', 'fhdfgh'),
(16, 1, 1, '2007-01-31 23:09:46', 'fghfdhg'),
(17, 1, 1, '2007-01-31 23:09:47', 'fdhgfdhg'),
(18, 1, 1, '2007-01-31 23:09:49', 'fhfdhfdg'),
(19, 1, 1, '2007-01-31 23:09:51', 'dfhgdfghfdhg'),
(20, 1, 1, '2007-01-31 23:09:52', 'hfdfhgdfhg'),
(21, 1, 1, '2007-01-31 23:09:53', 'fhddfhgfdhg'),
(22, 1, 1, '2007-01-31 23:09:55', 'hfdfhfdhg'),
(23, 1, 1, '2007-01-31 23:09:57', 'fghdfhdfhg'),
(24, 1, 1, '2007-01-31 23:09:59', 'fdghdfghfdgh'),
(25, 1, 1, '2007-01-31 23:10:00', 'fhfghfdgh'),
(26, 1, 1, '2007-01-31 23:10:02', 'fghdfhgfdhg'),
(27, 1, 1, '2007-01-31 23:10:04', 'fhgdfhgdfh'),
(63, 1, 3, '2007-02-02 13:15:42', 'lkhfd\r\nsdfg'),
(62, 1, 3, '2007-02-02 13:15:27', 'lkhfd\r\nsdfg'),
(61, 1, 3, '2007-02-02 13:14:19', 'zxvxv\r\nafg'),
(60, 1, 3, '2007-02-02 13:13:51', 'sadf\r\ndsf'),
(59, 1, 3, '2007-02-02 13:12:51', 'sdg\r\nsdgf\r\n'),
(58, 1, 3, '2007-02-02 13:12:48', 'dsf'),
(57, 1, 3, '2007-02-02 13:12:36', 'asdfsaf\r\nfsdgsd'),
(56, 1, 3, '2007-02-02 13:12:28', 'dsafd\r\nkjhf'),
(55, 1, 3, '2007-02-02 13:12:06', 'dsafd\r\nkjhf'),
(54, 1, 3, '2007-02-02 13:10:23', 'sdsd\r\nasdf'),
(53, 1, 3, '2007-02-02 13:09:34', 'sadaf\r\ndfsdf'),
(72, 5, 3, '2007-02-03 14:37:13', 'asfdsfd'),
(45, 1, 2, '2007-01-31 23:20:23', 'xzcv'),
(64, 1, 3, '2007-02-02 13:15:58', 'lkhfd\r\nsdfg'),
(65, 1, 3, '2007-02-02 13:18:43', 'lkhfd\r\nsdfg'),
(66, 1, 3, '2007-02-02 13:18:57', 'lkhfd\r\nsdfg'),
(67, 1, 3, '2007-02-02 21:43:07', 'ciao\r<br>caio'),
(68, 1, 3, '2007-02-02 21:43:15', 'ciao ciccio'),
(71, 5, 3, '2007-02-03 14:37:08', 'sadfsdf'),
(73, 5, 3, '2007-02-03 14:37:16', 'asfasf'),
(74, 5, 3, '2007-02-03 14:37:21', 'asdfasfd'),
(75, 5, 3, '2007-02-03 14:37:23', 'asdfasdf'),
(76, 5, 3, '2007-02-03 14:37:26', 'dsafasdf'),
(77, 5, 8, '2007-02-03 14:42:15', 'dsfdasf'),
(78, 5, 3, '2007-02-03 14:47:10', 'jh\r<br>fdsg'),
(79, 5, 8, '2007-02-03 14:47:22', 'zcz<xc'),
(80, 5, 8, '2007-02-03 14:48:43', 'asds'),
(83, 1, 8, '2007-01-01 18:56:34', 'lk');
Qualcuno riesce a dirmi il perchè?
Grazie mille

 Qualcuno riesce a dirmi il perchè?
La tua query non funziona perchè l'utente che selezioni non è detto che 
sia quello che ha la data di inserimento più grande. Gli aggregatori di 
un GROUP BY agiscono separatamente sui campi ed in assenza di un 
aggregatore tipo max, sum, etc, Mysql prende il primo record 
disponibile. In pratica ottieni un recordset in cui per ogni 
discussione hai il primo utente e la data più grande, ma questo utente 
e questa data non è detto che provengano dallo stesso record.
Per ottenere ciò che vuoi ti occorre una subquery.
Vedi ad esempio, per una rapida guida:
http://database.html.it/guide/lezione/2452/le-subquery/

Grazie mille, mi hai illuminato sulla retta via!
Grazie ancora