DISTINCT sur un LEFT JOIN ??

Eléphant du PHP | 189 Messages

02 déc. 2008, 17:10

Bonsoir,

Dans l'idée d'optimiser mes requêtes j'aimerais ne faire qu'une requête sur ma table utilisateur, et en même temps récupérer une seul session qui lui est attribuée..

Le problème est que ma relation est 1 -> n

Voici les tables :

Code : Tout sélectionner

--- Version du serveur: 5.0.45 CREATE TABLE IF NOT EXISTS `users` ( `id` int(11) NOT NULL auto_increment, `pseudo` varchar(20) NOT NULL, `pass` varchar(32) NOT NULL, `mail` varchar(255) NOT NULL, `new_mail` varchar(255) NOT NULL, `level` int(11) NOT NULL default '0', `status_online` enum('1','0') NOT NULL default '0', `status_irc` tinyint(1) NOT NULL, `ison` tinyint(1) NOT NULL, `accueil` varchar(20) NOT NULL, `nbr_lst_membres` int(11) NOT NULL, `nbr_lst_chans` int(11) NOT NULL, `active` varchar(32) NOT NULL, `code` varchar(255) NOT NULL, `inscription` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ; -- -- Contenu de la table `users` -- INSERT INTO `users` (`id`, `pseudo`, `pass`, `mail`, `new_mail`, `level`, `status_online`, `status_irc`, `ison`, `accueil`, `nbr_lst_membres`, `nbr_lst_chans`, `active`, `code`, `inscription`) VALUES (1, 'Number', '9c56c011e227195a846510719553f716', '[email protected]', '', 1, '1', 1, 1, '', 0, 0, '1', '', '2008-11-25 15:10:27'); -- -------------------------------------------------------- -- -- Structure de la table `users_sessions` -- CREATE TABLE IF NOT EXISTS `users_sessions` ( `user_id` int(11) NOT NULL, `sid` varchar(32) NOT NULL, `derniere_visite` datetime NOT NULL, `derniere_connexion` datetime NOT NULL, `session_life` datetime NOT NULL, `ip` varchar(40) NOT NULL, `page` varchar(255) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -- Contenu de la table `users_sessions` -- INSERT INTO `users_sessions` (`user_id`, `sid`, `derniere_visite`, `derniere_connexion`, `session_life`, `ip`, `page`) VALUES (1, 'e48283jck9u5ljjda8mi836ti0', '2008-12-02 15:49:59', '2008-12-02 13:11:26', '2009-01-02 13:11:26', '127.0.0.1', 'page=membres'), (1, 'g2vv5v1cq7cnh97jscjq55rkn3', '2008-12-02 15:54:38', '2008-12-02 15:53:58', '2009-01-02 15:53:58', '139.165.96.129', 'page=membres');
Voici ce que j'ai essayé :

Code : Tout sélectionner

SELECT users.id,users.pseudo as pseudo,users.status_online,DATE_FORMAT(users.inscription, "%d %b %Y %h:%i %p") as inscription, profils.genre as genre,profils.date_naissance as age,profils.localisation as localisation,profils.site_web as site_web,users_sessions.derniere_visite FROM users,users_profils as profils LEFT JOIN users_sessions ON profils.user_id = users_sessions.user_id WHERE users.id = profils.user_id AND active=1 ORDER BY pseudo ASC LIMIT 0, 20
Ce qui me retourne par exemple pour un utilisateur User1 qui est connecté a deux endroits (Pc1,Pc2) ceci :

User1 Pc1
User1 Pc2

Mon but étant de ne récuperer que :
User1 Pc1 Ou Pc1 est la date (derniere_visite) la plus récente

Est-ce possible ?


Edit :
Il y aurait bien la solution d'une requête DISTINCT sur le résultat de la requête si dessus.. Mais je suis certain que vous me trouverez beaucoup mieux.. Enfin j'espère, sinon je devrai refaire tout le code !! :(


Edit 2 :
Voila la requête "qui va bien", mais est-ce une bonne requête ? :
SELECT id,pseudo,status_online,DATE_FORMAT(inscription, "%d %b %Y %h:%i %p") as inscription, genre,date_naissance as age,localisation,site_web,sessions.derniere_visite FROM users,users_profils LEFT JOIN ( SELECT user_id,MAX(derniere_visite) as derniere_visite FROM users_sessions ) sessions ON users_profils.user_id = sessions.user_id WHERE users.id = users_profils.user_id AND active=1 ORDER BY pseudo ASC LIMIT 0, 20