Bdd avec LEFT JOIN, tri sur deux champs [SQL] - SQL/NoSQL - Programmation
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
Marsh Posté le 31-03-2009 à 10:39:30
(et c'est encore plus lisisble avec un alias sur le champ decodé )
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!!!
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";
Marsh Posté le 31-03-2009 à 12:52:43
leica69 a écrit : |
Non, decode, c'est oracle only.
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
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
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.