Problème de requete

Invité
Invité n'ayant pas de compte PHPfrance

26 mai 2006, 01:06

Bonjour,
Voilà un petit moment que je suis sur mon problème, mais je n'arrive pas à le résoudre. J'aimerais trier les résultats d'une de mes requetes en fonction d'un champ qui s'appelle Nopiste, mais ça marche pas. A chaque fois que j'ajoute " ORDER BY fa1.Nopiste", a requete ne fonctionne plus. Mais mes resultats ne s'affiche pas dans l'ordre que je veux. Qu'est ce qui ne va pas dans la requete suivante ?
$sql = "SELECT fa2.Id as Id, fa1.IdDisc as IdDisc, fa2.Link as Link, fa2.ClipLink as ClipLink, fa1.Nopiste as Nbpistes, fa1.NomDisc as NomDisc, fa2.NomDisc as NomTitre, fa1.Type as Type, fa1.ImgCity as ImgCity, fa2.Nopiste as Nopiste, fa1.PRIDFnac as PRIDFnac, fa1.PRIDVirgin as PRIDVirgin, fa1.Label as Label, fa1.Date as Date, fa1.PochetteGd as PochetteGd, fa1.PochettePt as PochettePt FROM fiches_albums as fa1 INNER JOIN fiches_albums as fa2 ON fa2.IdDiscPere=fa1.IdDisc WHERE (fa1.IdDiscPere='0' AND fa1.Id_Artist='".$_GET['type']."') ORDER BY fa1.Nopiste";
Merci

Mammouth du PHP | 19672 Messages

26 mai 2006, 07:01

Je peux me tromper, mais à mon avis, tu peux faire ta jointure sans utiliser INNER JOIN, proposition:
$sql = "SELECT fa2.Id         as Id, 
       fa1.IdDisc     as IdDisc, 
       fa2.Link       as Link, 
       fa2.ClipLink   as ClipLink, 
       fa1.Nopiste    as Nbpistes, 
       fa1.NomDisc    as NomDisc, 
       fa2.NomDisc    as NomTitre, 
       fa1.Type       as Type, 
       fa1.ImgCity    as ImgCity, 
       fa2.Nopiste    as Nopiste, 
       fa1.PRIDFnac   as PRIDFnac, 
       fa1.PRIDVirgin as PRIDVirgin, 
       fa1.Label      as Label, 
       fa1.Date       as Date, 
       fa1.PochetteGd as PochetteGd, 
       fa1.PochettePt as PochettePt 
FROM fiches_albums as fa1, 
     fiches_albums as fa2 
WHERE fa2.IdDiscPere = fa1.IdDisc 
  AND fa1.IdDiscPere = 0 
  AND fa1.Id_Artist='". $_GET['type'] ."' 
ORDER BY fa1.Nopiste;";
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 1511 Messages

26 mai 2006, 07:58

Juste comme ca, j'ai vu dans beaucoup de requetes mysql "as", a quoi correspond le "as" dans vos requetes?
@+

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

26 mai 2006, 08:58

Je peux me tromper, mais à mon avis, tu peux faire ta jointure sans utiliser INNER JOIN, proposition:
Quel est le gain ?

le problème ne vient certainement pas de là (c'est la même chose avec ou sans JOIN) et ça rend le code moins lisible
Dans la mesure du possible, utilisez toujours un opérateur de jointure normalisé Sql2 (mot clef JOIN).

En effet :

* Les jointures faites dans la clause WHERE (ancienne syntaxe de 1986 !) ne permettent pas de faire la distinction de prime abord entre ce qui relève du filtrage et ce qui relève de la jointure.
* Il est à priori absurde de vouloir filtrer dans le WHERE (ce qui restreint les données du résultat) et de voiloir "élargir" ce résultat par une jointure dans la même clause WHERE de filtrage.
* La lisibilité des requêtes est plus grande en utilisant la syntaxe à base de JOIN, en isolant ce qui est du filtrage et de la jointure, mais aussi en isolant avec clarté chaque condition de jointures entre chaque couples de table.
* L'optimisation d'exécution de la requête est souvent plus pointue du fait de l'utilisation du JOIN.
* Lorsque l'on utilise l'ancienne syntaxe et que l'on supprime la clause WHERE a des fins de tests, le moteur SQL réalise le produit cartésiens des tables ce qui revient la plupart du temps à mettre à genoux le serveur !
=> http://sql.developpez.com/sqlaz/jointures/#L1
Juste comme ca, j'ai vu dans beaucoup de requetes mysql "as", a quoi correspond le "as" dans vos requetes?
@+
C'est un alias, qui permet de renommer une colonne ou une table dans une requête
Exemple (requête bidon) :

Code : Tout sélectionner

SELECT SUM(DATEDIFF(col1 - col2 *5)) FROM table
Sympa à exploiter comme nom de colonne en sortie ce "SUM(DATEDIFF(col1 - col2 *5))" !!!
ALors que comme ça :

Code : Tout sélectionner

SELECT SUM(DATEDIFF(col1 - col2 * 5)) AS somme_diff_dates FROM table
les résultats seront dans la colonne "somme_diff_dates", bien plus lisible et facile à exploiter en PHP par exemple ;)

Pareil pour les noms de table, si tu as "table_relations_clienteles", et que ce nom revient souvent dans la requête, autant utiliser un alias genre "trc", on gagne en place et en lisibilité

Mammouth du PHP | 1511 Messages

26 mai 2006, 09:02

Ah ok ! :D
Nickel, je vais pouvoir me simplifier la vie :lol:
Peut on faire la même chose sur les tables comme par exemple lorsque l'on fait des requetes sur des tables liées?
@+

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

26 mai 2006, 09:10

Pour le problème original de ce post :
à tout hasard, quel est le type de la colonne "fa1.Nopiste" ?

Pour momox (si tu as d'autres questions tu ouvriras un nouveau sujet ensuite, après être allé dans la doc)

Oui, tu peux aliaser plusieurs tables, c'est d'ailleurs ce que notre Invité a fait si tu regardes sa requête.

Pour en savoir plus : le manuel
http://dev.mysql.com/doc/refman/5.0/en/select.html
http://dev.mysql.com/doc/refman/5.0/en/ ... alias.html