Question sur une jointure

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Question sur une jointure

par Snipy » 18 août 2007, 13:09

Nickel
Merci beaucoup :D

par Vikchill » 17 août 2007, 17:22

Essaye ceci:
$query1="SELECT dom.nom as dom, ext.nom as ext, phpl_matchs.buts_dom, phpl_matchs.buts_ext,
                        phpl_journees.date_prevue, date_reelle,
                        dom.id_equipe as eqdom, ext.id_equipe as eqext, phpl_matchs.id as id_match
                FROM equipes as dom, equipes as ext, phpl_matchs, phpl_journees
                WHERE phpl_matchs.id_equipe_dom=dom.id_equipe
                        AND phpl_matchs.id_equipe_ext=ext.id_equipe
                        AND phpl_journees.id_champ='$champ'
                        AND phpl_journees.numero='$numero'
                        AND phpl_matchs.id_journee=phpl_journees.id
                        AND dom.nom!='exempte'
                        AND ext.nom!='exempte'
                        ORDER BY date_reelle asc"; 
Tu as une virgule avant le 'WHERE', la base de données attends donc le nom d'une table :)

par Snipy » 17 août 2007, 13:05

Ok je vois :)

J'ai essayé de modifier la requête (car je n'ai pas de table phpl_clubs)

Mais j'ai cette erreur qui s'affiche
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE phpl_matchs.id_equipe_dom=dom.id_equipe
Voici ma requête modifiée
 $query1="SELECT dom.nom as dom, ext.nom as ext, phpl_matchs.buts_dom, phpl_matchs.buts_ext,
                        phpl_journees.date_prevue, date_reelle,
                        dom.id_equipe as eqdom, ext.id_equipe as eqext, phpl_matchs.id as id_match
                FROM equipes as dom, equipes as ext, phpl_matchs, phpl_journees,
                WHERE phpl_matchs.id_equipe_dom=dom.id_equipe
                        AND phpl_matchs.id_equipe_ext=ext.id_equipe
                        AND phpl_journees.id_champ='$champ'
                        AND phpl_journees.numero='$numero'
                        AND phpl_matchs.id_journee=phpl_journees.id
                        AND dom.nom!='exempte'
                        AND ext.nom!='exempte'
                        ORDER BY date_reelle asc";
Merci d'avance :)

par Cyrano » 17 août 2007, 06:26

L'alias multiple sur une même table permet de travailler avec plusieurs versions virtuelles de cette table. On utilise cette technique pour faire par exemple une auto-jointure, c'est à dire une jointure d'une table avec elle-même sans avoir de conflit avec les noms de colonnes qui sont évidemment les mêmes.

Suppose une table "categorie" avec les colonnes suivantes :
- cat_id : clé primaire, entier, non null, auto-incrémenté;
- cat_parent_id : clé étrangère, entier, null
- cat_nom : varchar

La clé étrangère cat_parent_id faisant référence à cat_id de la même table. Idée générale, avoir des sous-catégories, comme pour un menu de navigation par exemple.

On fera donc une jointure avec :

Code : Tout sélectionner

... FROM categorie AS cat1, categorie AS cat2 ...
Mais dans le reste de ta requête, il faudra préfixer les noms de colonnes avec l'alias de la table correspondante, faute de quoi, ton serveur de base de données te retournera une erreur pour cause d'ambiguïté, le serveur ne sachant pas à laquelle des tables relier le nom de la colonne. On utilisera donc par exemple cat1.cat_id, cat1.cat_nom, cat2.cat_parent_id : identifiant et nom dans la première table virtuelle, identifiant parent dans la seconde.

par Snipy » 16 août 2007, 22:13

La commande AS en sql permet de donner un alias à un nom de champ ou à un nom de table
Je suis bien d'accord,

Mais je ne comprend pas

Code : Tout sélectionner

phpl_equipes as dom, phpl_equipes as ext,
OU

Code : Tout sélectionner

phpl_clubs as cldom, phpl_clubs as clext
comment la meme table peut etre renommé 2fois (dans les 2 cas ci dessus) ?

par Ryle » 16 août 2007, 21:02

La commande AS en sql permet de donner un alias à un nom de champ ou à un nom de table, ce qui te permet d'alléger l'écriture de la requête quand il te faut le répéter, où quand tu appliques des fonctions pour simplifier le nom du champ retourné :

Code : Tout sélectionner

SELECT COUNT(nom_du_champ) AS total FROM ma_premiere_table AS a, ma_seconde_table AS b WHERE a.champ1 = b.champ1 AND a.champ2 = b.champ2 ...

Ps : Et j'en profite pour déplacer le sujet dans le forum SQL, ce qui est plus approprié pour tes questions concernant ce langage :)

Question sur une jointure

par Snipy » 16 août 2007, 20:02

Me revoici toujorus en quête de réponses :D

J'essaye de décoder cette fonction
<?php $query1="SELECT cldom.nom as cldom, clext.nom as clext, phpl_matchs.buts_dom, phpl_matchs.buts_ext,
                        phpl_journees.date_prevue, cldom.id as cliddom, clext.id as clidext, date_reelle,
                        dom.id as eqdom, ext.id as eqext, phpl_matchs.id as id_match
                FROM phpl_equipes as dom, phpl_equipes as ext, phpl_matchs, phpl_journees,
                     phpl_clubs as cldom, phpl_clubs as clext
                WHERE phpl_matchs.id_equipe_dom=dom.id
                        AND phpl_matchs.id_equipe_ext=ext.id
                        AND phpl_journees.id_champ='$champ'
                        AND phpl_journees.numero='$numero'
                        AND dom.id_club=cldom.id
                        AND ext.id_club=clext.id
                        AND phpl_matchs.id_journee=phpl_journees.id
                        AND cldom.nom!='exempte'
                        AND clext.nom!='exempte'
                        ORDER BY date_reelle asc";
Mais je ne comprend pas la partie FROM
FROM phpl_equipes as dom, phpl_equipes as ext, phpl_matchs, phpl_journees,
phpl_clubs as cldom, phpl_clubs as clext
Que veut dire le as dans ces cas la ?

Merci d'avance de m'éclaircir.

Si vous avez besoin des tables de la BDD n'hésitez pas.

Bonne soirée