Page 1 sur 1

Doublons

Posté : 13 mars 2008, 14:46
par meffany
Bonjour à tous,

je solicite votre aide pour supprimer des doublons lors d'une requête.

Voilà ma requête de base.
$this->ipsclass->DB->simple_construct( array( 'select' => 'p.s_id, p.user_id, t.post_date, t.s_name, t.user_name, t.s_art, t.s_art_tn, t.s_art_type, t.user_id, t.cat_id, t.t_version, t.s_artist, t.price',
	'from'   => "mlite_played p LEFT JOIN ".SQL_PREFIX."mlite_songs t ON (p.s_id=t.s_id)",
	'where'  => 't.s_private=0 AND t.s_open=1 AND p.user_id!=t.user_id',
	'order'  => 'p.p_id DESC',
	'limit'  => array(0, intval($this->ipsclass->vars['nbr_lp']))
));
J'ai essayer d'utiliser DISTINCT(p.s_id) avec et sans 'GROUP BY p.s_id' mais je n'obtiens pas le résultat voulu. J'aurais aimer que ma requete supprime les doublons et me les class par 'p.p_id DESC'

Quelqu'un aurait il un petit conseil ? Y a t'il une autre maniére de pouvoir supprimer les doublons autre qu'avec DISTINCT qui est plutôt lent à ce que je crois savoir.

Voila le format de mes tables

Code : Tout sélectionner

CREATE TABLE `played` ( `p_id` int(11) NOT NULL auto_increment, `s_id` int(11) NOT NULL default '0', `user_id` mediumint(8) NOT NULL default '0', PRIMARY KEY (`p_id`), KEY `s_id` (`s_id`) ) ENGINE=MyISAM AUTO_INCREMENT=425 DEFAULT CHARSET=latin1

Code : Tout sélectionner

CREATE TABLE `songs` ( `s_id` int(11) NOT NULL auto_increment, `s_name` varchar(255) NOT NULL default '', `s_artist` varchar(255) NOT NULL default '', `s_info` text NOT NULL, `s_art` text NOT NULL, `s_art_tn` text NOT NULL, `s_art_type` varchar(15) NOT NULL default 'local', `s_hits` int(11) NOT NULL default '0', `s_downloads` int(11) NOT NULL default '0', `s_rate` int(11) NOT NULL default '0', `s_rate_count` int(11) NOT NULL default '0', `s_score` int(255) NOT NULL default '0', `s_real` varchar(255) NOT NULL default '', `s_url` text NOT NULL, `s_size` int(10) NOT NULL default '0', `s_mime` varchar(255) NOT NULL default '', `s_mime_img` text NOT NULL, `s_ext` varchar(10) NOT NULL default '', `s_playtime` int(10) default NULL, `s_frequency` int(5) default NULL, `s_channel` enum('mono','stereo','joint stereo','dual channel') default NULL, `s_bitrate` int(5) default NULL, `s_type` varchar(15) NOT NULL default 'local', `s_open` tinyint(1) NOT NULL default '1', `s_report` int(11) NOT NULL default '0', `s_status` varchar(15) NOT NULL default '', `s_topic` int(10) NOT NULL default '0', `cat_parent` int(11) NOT NULL default '0', `cat_id` int(11) NOT NULL default '0', `user_id` mediumint(8) NOT NULL default '0', `user_name` varchar(255) NOT NULL default '', `ip_address` varchar(64) default NULL, `post_date` int(10) NOT NULL default '0', `last_update` int(10) NOT NULL default '0', `s_bpm` int(3) NOT NULL default '0', `s_podcast` int(1) NOT NULL default '1', `furl` varchar(255) NOT NULL default '', `auto_delete` int(11) NOT NULL default '0', `views` int(255) NOT NULL default '0', `epromo_date` int(11) NOT NULL default '0', `epromoter` mediumint(8) NOT NULL default '0', `epromoter_name` varchar(255) NOT NULL default '', `s_private` int(1) NOT NULL default '0', `price` decimal(4,2) NOT NULL default '0.00', `t_version` varchar(255) NOT NULL, `t_label` varchar(255) NOT NULL, `t_auth` varchar(255) NOT NULL, `t_compo` varchar(255) NOT NULL, `t_publisher` varchar(255) NOT NULL, `t_original_id` int(11) NOT NULL default '0', PRIMARY KEY (`s_id`), KEY `cat_id` (`cat_id`) ) ENGINE=MyISAM AUTO_INCREMENT=41 DEFAULT CHARSET=latin1

Merci à tous.[/code]

Posté : 13 mars 2008, 16:03
par Ryle
Euh... peux tu également préciser ce que tu attends de ta requête ? :) Quels sont les champs qu'elle doit te retourner, sur lesquels y a-t-il des doublons ? ...

La commande DISTINCT permet de supprimer les résultats en double pour qu'ils n'apparaissent qu'une seule fois. Si tu as plusieurs s_id identique mais que les informations qui suivent varient, ils seront considérés comme des résultats différents et le distinct n'aura pas d'effet.

Ce n'est par ailleurs pas une fonction de groupe, il n'y a donc pas de raison d'utiliser GROUP BY. Cette commande s'utilise lorsqu'une partie seulement des données que tu récupères se trouve groupée par une fonction (genre SUM(), AVG(), COUNT() ...) et te permet alors de spécifier les autres champs de ta requête (ceux dont les valeurs ne sont pas groupées) pour que les résultats soient correctement associés.

Posté : 13 mars 2008, 19:50
par meffany
Merci pour tes précisions Ryle. Je voudrais supprimer les doublons du champ 's_id' de la table played. Je pensais que mettre DISTINCT(p.s_id) "le champ s_id entre parenthése donc" permettrait de supprimer les doublons. Mais ca ne doit pas être le cas apparement ?