Comment simplifier une double requête par jointure?


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

Comment simplifier une double requête par jointure?

Message le Mar Mar 02, 2010 12:34

Bonjour,

Je cherche à simplifier une double requête par une jointure (si c'est possible) car il me semble que c'est plus rapide et je dois avoué avoir quelques difficultés :?

Code: Tout sélectionner
<?php
//on sélectionne les articles
$article = mysql_query("SELECT id, categorie_de_la_page FROM PAGE_DU_SITE ORDER BY id DESC ");

while($affiche = mysql_fetch_array($article))
{
  echo ''.$affiche["id"].''.$affiche["titre_de_la_page"].'<br/>';

//on sélectionne les catégories correspondantes
$cat = mysql_query('SELECT id, nom_sous_categorie FROM SOUS_CATEGORIE WHERE id='.$affiche['categorie_de_la_page'].'');

while($affiche1 = mysql_fetch_array($cat))
{
echo ''.$affiche1["id"].'-'.$affiche1["nom_sous_categorie"]).'';
}
//on ferme la 1ere boucle while
}
?>


Le champ "categorie_de_la_page" de la table "PAGE_DU_SITE" correspond au champ "id" de la table "SOUS_CATEGORIE" qui sont tout 2 des chiffres entier.
Ainsi : "categorie_de_la_page" est égal à "id" -> me ressort le bon nom de la catégorie correspondant à l'article.

Si vous avez quelques suggestions ...
Merci


dorian53
WRInaute passionné
WRInaute passionné
 
Messages: 2215
Inscription: 10 Avr 2005

Re: Comment simplifier une double requête par jointure?

Message le Mar Mar 02, 2010 14:48

Salut,

C'est tout simple, tu lies les deux id ensemble.

http://dev.mysql.com/doc/refman/5.0/fr/join.html

Exemple
Code: Tout sélectionner
mysql> SELECT table1.*, table2.* FROM table1
    ->        INNER JOIN table2 ON table1.id=table2.id
    ->        WHERE table2.id IS NULL;


Le ON correspond à tes deux 2 id.


Anto1982
WRInaute passionné
WRInaute passionné
 
Messages: 1334
Inscription: 7 Mai 2009

Re: Comment simplifier une double requête par jointure?

Message le Mar Mar 02, 2010 15:04

dorian53,

Peux tu stp nous expliquer la différence entre INNER et LEFT (dans mon cas j'utilise LEFT JOIN... et non INNER JOIN)
Merci par avance,

Anto

Matthieu_s
WRInaute discret
WRInaute discret
 
Messages: 87
Inscription: 3 Aoû 2006

Re: Comment simplifier une double requête par jointure?

Message le Mar Mar 02, 2010 15:31

INNER JOIN te retourne uniquement les champs ou tu as une correspondance dans les 2 tables

Par exemple
Code: Tout sélectionner
SELECT * FROM Table1 INNER JOIN Table2 ON Table1.valeur=Table2.valeur


Tu n'obtiendras que les lignes ou valeur est égale dans Table1 et Table2

Alors que

Code: Tout sélectionner
SELECT * FROM Table1 LEFT JOIN Table2 ON Table1.valeur=Table2.valeur


La tu vas obtenir toutes les lignes de la table1, et les lignes de la table2 ou le champ valeur est égal à celui de table1. Dans le cas ou il n'est pas égale, les champs de table2 prendront la valeur nulle dans les résultats de la requête.


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

Re: Comment simplifier une double requête par jointure?

Message le Mar Mar 02, 2010 15:53

Merci Miss Google :).

Même avec ton exemple + le lien je me fume les neurones .. ça va m'occuper 2/3 semaines ^^ !


Anto1982
WRInaute passionné
WRInaute passionné
 
Messages: 1334
Inscription: 7 Mai 2009

Re: Comment simplifier une double requête par jointure?

Message le Mar Mar 02, 2010 16:04

OK, merci pour l'info!

Anto


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

Re: Comment simplifier une double requête par jointure?

Message le Mar Mar 02, 2010 22:24

Re moi ^^,

Je suis presque parvenu à mes fins après mainte tentative mais un problème réside ...
Suite à ma requête, je construis 2 liens. L'un menant vers un article et l'autre vers la catégorie de l'article. Le "hic", c'est que tout deux utilisent un "id" et comme je ne suis pas habitué à ce style de requête .. bhin je suis largué :? .
Bref, dans la requête qui suis c'est l'id de la catégorie qui est pris en compte dans les 2 liens $affiche2["id"] et je ne sais pas comment y remédier ...
Code: Tout sélectionner
$teste2 = mysql_query("SELECT * FROM PAGE_DU_SITE INNER JOIN SOUS_CATEGORIE ON PAGE_DU_SITE.categorie_de_la_page=SOUS_CATEGORIE.id ORDER BY PAGE_DU_SITE.id DESC LIMIT 0,5");

while($affiche2 = mysql_fetch_array($teste2))
{
//Lien vers l'article
  echo '<a title="'.$affiche2["titre_de_la_page"].'" href="'.OptimiseUrl($affiche2["titre_de_la_page"]).'-'.$affiche2["id"].'.php">'.$affiche2["titre_de_la_page"].'</a>';
//lien vers la catégorie
echo '<a title="'.$affiche2["nom_sous_categorie"].'" href="sous-categorie-'.$affiche2["id"].'-'.OptimiseUrl($affiche2["nom_sous_categorie"]).'.php">'.$affiche2["nom_sous_categorie"].'</a>';
}

Une suggestion ?

Merci


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8575
Inscription: 23 Nov 2005

Re: Comment simplifier une double requête par jointure?

Message le Mar Mar 02, 2010 22:44

SELECT * c'est le mal. Et pour ta problématique, les alias sont tes amis (perso c'est pour ça que je n'appelles pas mes clés primaires avec le même nom, mais que je les préfixe avec le nom de la table) :

Code: Tout sélectionner
SELECT PAGE_DU_SITE.titre_de_la_page, PAGE_DU_SITE.id as id_page, SOUS_CATEGORIE.nom_sous_categorie, SOUS_CATEGORIE.id as id_sous_categorie  FROM PAGE_DU_SITE INNER JOIN SOUS_CATEGORIE ON PAGE_DU_SITE.categorie_de_la_page=SOUS_CATEGORIE.id ORDER BY PAGE_DU_SITE.id DESC LIMIT 0,5


Une fois avoir fait ça, tu peux utiliser id_page et id_sous_categorie


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

Re: Comment simplifier une double requête par jointure?

Message le Mer Mar 03, 2010 8:28

Oki, merci UsagiYojimbo :D , je vais essayer ça.

Donc, quand on fait une jointure et que si sur celle ci 2 champs portent le même nom, il faut systématiquement utiliser les alias...c'est méga chiant comme requête :lol: !

Par apport à ma double requête en haut de poste, j'y gagne vraiment quelque part ou ça fait juste plus fun ?


dorian53
WRInaute passionné
WRInaute passionné
 
Messages: 2215
Inscription: 10 Avr 2005

Re: Comment simplifier une double requête par jointure?

Message le Mer Mar 03, 2010 10:38

tryan a écrit:Par apport à ma double requête en haut de poste, j'y gagne vraiment quelque part ou ça fait juste plus fun ?


Tu y gagnes et c'est une utilisation ordinaire, ne pas faire la jointure et gérer ça manuellement est contre nature.

Si tu avais 100 catégories, tu aurais fait 101 requêtes (sans oublier le traitement PHP annexe : while, $var, ...).
Là, une seule optimisée par la base de données.


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

Re: Comment simplifier une double requête par jointure?

Message le Mer Mar 03, 2010 13:15

Oki, tout semble fonctionner parfaitement :).

Merci bien pour tout ses renseignements fort utiles mais haut combien compliqué quand même ;).


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

Re: Comment simplifier une double requête par jointure?

Message le Mer Mar 03, 2010 15:56

Re moi,

Peut on également "jointer" ^^ 4 requêtes disposant toutes d'un champ égales (chiffres entier identiques dans les 4 tables) ?

Matthieu_s
WRInaute discret
WRInaute discret
 
Messages: 87
Inscription: 3 Aoû 2006

Re: Comment simplifier une double requête par jointure?

Message le Mer Mar 03, 2010 16:06

Oui, si tu as une condition de jointure (champ égal dans les 4 tables), tu peux joindre 4 tables sans problème. C'est valable pour n tables si ta condition de jointure est valable sur n table.


tryan
WRInaute passionné
WRInaute passionné
 
Messages: 2355
Inscription: 20 Fév 2005

Re: Comment simplifier une double requête par jointure?

Message le Mer Mar 03, 2010 16:58

Oki, merci :).

Je crois que je vais m'amuser pendant longtemps sur celle-la ^^ !


Anto1982
WRInaute passionné
WRInaute passionné
 
Messages: 1334
Inscription: 7 Mai 2009

Re: Comment simplifier une double requête par jointure?

Message le Mer Mar 03, 2010 19:03

Tu peux même JOINTER plusieurs fois la même table...

(si si, ça a une utilité.... quand on cherche bien... et franchement c'est surpuissant)

Comment simplifier une double requête par jointure?

Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité