difficulté sur une requete Mysql

Eléphanteau du PHP | 39 Messages

17 sept. 2009, 17:55

Bonjour à tous,

j'éprouve une difficulté sur une requete Mysql.
Cette requete permet d'afficher la discographie d'un groupe, j'affiche donc ainsi le nom de l'album et les noms des morceaux qui corresponde à cette album.
le regroupement se fait bien mais c'est l'ordre d'arrivée des albums qui n'ai pas par date (albums.albums_date) mais par non d'album.

voici le code :
SELECT albums.*, tracks.* FROM (tracks LEFT JOIN albums ON albums.albums_id=tracks.tracks_albums_id) ORDER BY albums.albums_name, tracks.tracks_name, albums.albums_date
merci à tous.
Modifié en dernier par murdok le 18 sept. 2009, 15:42, modifié 1 fois.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

18 sept. 2009, 10:23

Ben oui tu tries d'abord par nom d'album, ensuite par nom de chanson et enfin par date. L'ordre d'arrivée correspond à ce que tu fais dans ta requête, c'est tout.

De plus, je trouve ta requête assez bizarre, pourquoi passer par une sous requête avec une jointure externe plutôt que par une simple jointure ?!
SELECT * 
FROM albums
INNER JOIN tracks ON albums.albums_id=tracks.tracks_albums_id
ORDER BY albums.albums_name, tracks.tracks_name, albums.albums_date
A priori tous les albums comportent des chansons, pas besoin de LEFT OUTER JOIN :)

Eléphanteau du PHP | 39 Messages

18 sept. 2009, 11:21

merci beaucoup du retour, cependant je n'ai pas de changement dans mon resultat, je pense c'est du à un "simulated nested repeat"qui fait une vérification sur le nom de l'album.
voici mon code php
  <?php 
   $i=0;
   $j=0;
   do { ?> 

    <?php 
		     
	  
		  $TFM_nest = $row_Recordset_disco['albums_name'];
	
		  if ($lastTFM_nest != $TFM_nest) { 
		  ////// boucle pour un nouvel album
		  ?></td></tr></table> <?php 
		  $i=0;
		  $j=0;
		  $i++;
	      $lastTFM_nest = $TFM_nest;  ?>
          <BR />
  <table border="1" width="650" bgcolor="#f1c86e" cellpadding="6" bordercolor="#bc6927">  
    	<tr>
   		  <td width="200" valign="top">
    		<p><?php echo $row_Recordset_disco['albums_name']; ?> <BR>
			<em>(<?php echo $row_Recordset_disco['albums_label']; ?> - <?php echo DateMysqltoFr($row_Recordset_disco['albums_date']); ?>)</em></p>
    		<img border="0" src="<?php echo $objDynamicThumb1->Execute(); ?>" /> </td>     
     		<?php } ///////fin de boucle   
	  $j++; 
	  if ($j==1) { ?><td valign="top" > <?php } ?>
    <p><?php echo $row_Recordset_disco['tracks_name']; ?> <a href="admin/module_sound/sound/<?php echo $row_Recordset_disco['tracks_albums_id']; ?>/<?php echo $row_Recordset_disco['tracks_upload_file']; ?>">MP3</a> </p>


    <?php } while ($row_Recordset_disco = mysql_fetch_assoc($Recordset_disco)); ?>

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

18 sept. 2009, 11:31

Oui tu ne dois pas avoir de changement, la requête que je t'ai donnée fait normalement la même chose, mais de la façon la plus simple et la plus "naturelle".

Oublie PHP pour l'instant. Ouvre phpMyAdmin, ou un autre truc pour manipuler ta base, et teste ta requête dedans. Quand elle sera bonne, tu l'intégreras dans ton code.

Tu dis que tes résultats sont triés par nom d'album, et non par date, mais regarde :
SELECT *
FROM albums
INNER JOIN tracks ON albums.albums_id=tracks.tracks_albums_id
ORDER BY albums.albums_name,  # tu tries les albums par ordre alphabétique sur leur nom
 tracks.tracks_name,  # pour les lignes qui ont le même nom d'album, tu les tries par nom de chanson
albums.albums_date   # et ensuite, pour les lignes même nom d'album/même nom de chanson (c'est à dire probablement aucune ligne), tu tries par date.
Il faut que tu revoies tes critères de tri, ta requête fonctionne parfaitement et fait ce que tu lui demandes. Mais tu ne lui demandes pas de faire ce que tu veux :)

Eléphanteau du PHP | 39 Messages

18 sept. 2009, 11:46

Super merci beaucoup pour l'explication , c'est tout simple mais je n'avais pas saisi la logique des multicritères de tri.
je crois que la c'est tout bon j'ai mis ca en requete:
SELECT *
FROM albums INNER JOIN tracks ON albums.albums_id=tracks.tracks_albums_id
ORDER BY albums.albums_date DESC, albums.albums_name, tracks.tracks_name

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

18 sept. 2009, 12:07

C'est ce que j'aurais mis oui, il n'y a plus qu'à tester :)

Eléphanteau du PHP | 39 Messages

18 sept. 2009, 14:50

merci pour tout!
la ou j'ai placer le DESC c'est bien correct?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

18 sept. 2009, 15:10

Je ne sais pas, là tu auras les albums triés du plus récent au plus ancien, est-ce que c'est ce que tu veux ?

Eléphanteau du PHP | 39 Messages

18 sept. 2009, 15:13

oui! et ca marche nickel mais je voulais savoir si pour chaque élement qu'on souhaite trier on pouvait mettre ASC ou DESC tout de suite derrière

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

18 sept. 2009, 15:26

Oui, par défaut c'est ASC. Pense à aller regarder la documentation, les réponses à tes questions et des explications sur le fonctionnement y sont : http://dev.mysql.com/doc/refman/5.4/en/select.html

D'abord la doc, ensuite le forum si on a pas compris ou que ça marche pas ;)

Eléphanteau du PHP | 39 Messages

18 sept. 2009, 15:42

ca marche c'est bien noté merci encore!