par
sadeq » 28 août 2008, 10:57
select * from table1, table2 where table1.id = $id
Surement cette requête va répéter quelques enregistrements car en SQL, quand on met deux tables dans le FROM sans préciser leur relation le SELECT fait un graph des deux tables. C'est à dire que le résultat du SELECT contiendra le nombre d'enregistrements de la première table multiplié par le nombre d'enregistrements dans la deuxième table.
Exemple:
membre (id, nom) contient :
id, nom
1, toto
2, popo
peudo (id_membre, login) contient :
id_membre, login
1, login1
2, login2
La requête :
"SELECT * FROM membre, pseudo" retourne :
membre.id, membre.nom, pseudo.id_membre, pseudo.login
1, toto, 1, login1
1, toto, 2, login2
2, popo, 1, login1
2, popo, 2, login2
Les enregistrements de la table membre se sont multipliés par le nombre d'enregistrements de la table pseudo et le résultat n'est pas correct. Car le login1 doit correspondre selon toute logique seulement au membre toto et de même pour login2 qui désigne seulement popo
Pour éviter cette incohérence, il faut ajouter dans la requête une déclaration de la relation entre les tables membre et pseudo qui s'exprime ainsi : membre.id = pseudo.id_membre
Voici le SELECT correct alors:
"SELECT * FROM membre JOIN pseudo ON membre.id = pseudo.id_membre"
Ce qui retourne :
membre.id, membre.nom, pseudo.id_membre, pseudo.login
1, toto, 1, login1
2, popo, 2, login2
Après cette précision fondamentale du modèle relationnel SQL, si l'on veut faire une sélection (filtrage) d'enregistrements par le SELECT on doit ajouter une clause WHERE.
Par exemple, si l'on veut simplement les données concernant toto, la requête devient :
"SELECT * FROM membre JOIN pseudo ON membre.id = pseudo.id_membre WHERE membre.id=1"
Ce qui retourne :
membre.id, membre.nom, pseudo.id_membre, pseudo.login
1, toto, 1, login1
[quote]select * from table1, table2 where table1.id = $id [/quote]
Surement cette requête va répéter quelques enregistrements car en SQL, quand on met deux tables dans le FROM sans préciser leur relation le SELECT fait un graph des deux tables. C'est à dire que le résultat du SELECT contiendra le nombre d'enregistrements de la première table multiplié par le nombre d'enregistrements dans la deuxième table.
Exemple:
membre (id, nom) contient :
id, nom
1, toto
2, popo
peudo (id_membre, login) contient :
id_membre, login
1, login1
2, login2
La requête : [b]"SELECT * FROM membre, pseudo"[/b] retourne :
membre.id, membre.nom, pseudo.id_membre, pseudo.login
1, toto, 1, login1
1, toto, 2, login2
2, popo, 1, login1
2, popo, 2, login2
Les enregistrements de la table membre se sont multipliés par le nombre d'enregistrements de la table pseudo et le résultat n'est pas correct. Car le login1 doit correspondre selon toute logique seulement au membre toto et de même pour login2 qui désigne seulement popo
Pour éviter cette incohérence, il faut ajouter dans la requête une déclaration de la relation entre les tables membre et pseudo qui s'exprime ainsi : membre.id = pseudo.id_membre
Voici le SELECT correct alors:
[b] "SELECT * FROM membre JOIN pseudo ON membre.id = pseudo.id_membre" [/b]
Ce qui retourne :
membre.id, membre.nom, pseudo.id_membre, pseudo.login
1, toto, 1, login1
2, popo, 2, login2
Après cette précision fondamentale du modèle relationnel SQL, si l'on veut faire une sélection (filtrage) d'enregistrements par le SELECT on doit ajouter une clause WHERE.
Par exemple, si l'on veut simplement les données concernant toto, la requête devient :
[b] "SELECT * FROM membre JOIN pseudo ON membre.id = pseudo.id_membre WHERE membre.id=1" [/b]
Ce qui retourne :
membre.id, membre.nom, pseudo.id_membre, pseudo.login
1, toto, 1, login1