[SQL] Bdd avec LEFT JOIN, tri sur deux champs

Bdd avec LEFT JOIN, tri sur deux champs [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 31-03-2009 à 09:58:35    

Bonjour,
j'ai un souci avec une de mes BDD. Je n'ai pas trouvé de solution dans le forum, voicu la situation.
 
Il s'agit d'une BDD liée à une galerie d'artistes. J'ai 4 tables liées entre elles:
1/ artistes
  id
  nom
  prenom
  pseudo
  mail
  ...
 
2/ oeuvres
  id
  artiste (valeur de artistes.id)
  titre
  format
 
3/ styles
  id
  nom
  (exemple 1:peinture; 2: photo; 3:textile,...)  
 
3/ categories (table de liaison oeuvres - styles)
  oeuvre
  style
  (une oeuvre pouvant appartenir à divers styles comme peinture+photo)
 
J'ai:
la liste des styles différents avec les noms des artistes ayant au moins une oeuvre dans ce style:
Céramique
  Dupont, Jean
 
Peinture
 Dupont, Jean
 Chappuis, Martin
 
Photographie
 Dubois, Claude
 Niepce, Nicéphore

 

Citation :

Code:
//création d'une requête SQL pour obtenir la liste des catégories
$requete="SELECT * FROM categories ORDER BY nom";
$resultat=mysql_query($requete) or die ("Problème lors de la requête. Erreur: ".mysql_error());
while($ligne=mysql_fetch_array($resultat)){
 echo "\n<p>$ligne[nom]</p>";
 
 //création d'une requête SQL pour obtenir la liste des artistes
 $requete2 = "SELECT DISTINCT a.id,a.nom,a.prenom FROM ((oeuvres o LEFT JOIN l_oeuvre_cat l ON o.id=l.loc_oe) LEFT JOIN artistes a ON o.artiste=a.id) WHERE l.loc_cat=$ligne[id]";
 $resultat2=mysql_query($requete2) or die ("Problème lors de la requête. Erreur: ".mysql_error());
 while($ligne2=mysql_fetch_array($resultat2)){
  echo "\n<p><a href='artistes.php?id=$ligne2[id]'>$ligne2[nom], $ligne2[prenom]</a></p>";
 }
}


 
Mon problème:
je souhaite que pour les noms des artistes, si un pseudo est défini, le pseudo s'affiche et PAS le nom. Ca c'est facile. Le souci c'est de trier les artistes par ordre alphabétique nom OU pseudo. J'imagine passer par une requête UNION mais je ne vois pas comment l'intégrer.
Qqn peut-il m'aider?
 
D'avance merci.

Reply

Marsh Posté le 31-03-2009 à 09:58:35   

Reply

Marsh Posté le 31-03-2009 à 10:25:28    

Si tu arrives à sélectionner au niveau de ta requête le nom ou pseudo
avec une fonction SQL syle decode, case, iif, if ...
alors niveau tri ça devient assez simple  
=>
Order by < place de (nom/pseudo) dans select>  
 
ex:  
select chp1,chp2,decode(MonAiguillage =  1, Nom, pseudo)
from matable
order by 3  
 
ou
 
select chp1,chp2,chp3,chp4,decode(MonAiguillage =  1, Nom, pseudo)
from matable
order by 5
 
 
 
 


---------------
il n'y a pas que le VTT dans la vie, il y a le Snowboard aussi ...
Reply

Marsh Posté le 31-03-2009 à 10:39:30    

(et c'est encore plus lisisble avec un alias sur le champ decodé :D )


Message édité par skeye le 31-03-2009 à 10:39:34

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 31-03-2009 à 12:14:09    

J'ai des erreurs de syntaxe en faisant un test:
$requete2 = "SELECT pseudo,DECODE(pseudo,'Nirav','ok','KO') FROM artistes";
 
Ca devrait fonctionner avec MySQL!!!

Reply

Marsh Posté le 31-03-2009 à 12:28:51    

OK, j'ai réussi on utilisant une cndition IF:
$requete2 = "SELECT DISTINCT a.id,IF(a.pseudo<>'',a.pseudo,CONCAT(a.nom,', ',a.prenom)) mon_nom FROM ((oeuvres o LEFT JOIN l_oeuvre_cat l ON o.id=l.loc_oe) LEFT JOIN artistes a ON o.artiste=a.id) WHERE l.loc_cat=$ligne[id] ORDER BY mon_nom";

Reply

Marsh Posté le 31-03-2009 à 12:52:43    

leica69 a écrit :


Ca devrait fonctionner avec MySQL!!!


Non, decode, c'est oracle only.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 31-03-2009 à 12:54:38    

C'est ce que j'ai cru comprendre en survolant les forums. C'est pour ça que j'ai opté pour IF.
 
Merci pour votre aide

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed