des infos venant de 2 tables

ViPHP
pjl
ViPHP | 2119 Messages

10 juin 2005, 23:07

OUI j'ai une cle primaire "user"
Ou ca ?

sebf
Invité n'ayant pas de compte PHPfrance

10 juin 2005, 23:18

PRIMARY KEY (`user`)

ca y est pour mes 2 tables

Mammouth du PHP | 19672 Messages

10 juin 2005, 23:49

Attention, ce qui est une primary key dans une table ne devrait logiquement être dans l'autre qu'une clé étrangère, donc tu peux l'indexer, mais elle ne petu pas être unique si la cardinalité entre les deux tables est du type 1-n, c'est à dire 1 du coté où la clé est primaire et n coté clé étrangère. En revanche, celle où user est clé étrangère doit avoir un autre champ en clé primaire, en l'occurence id, user étant clé primaire dans ta table class_forza_2005
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

sebf
Invité n'ayant pas de compte PHPfrance

10 juin 2005, 23:52

Attention, ce qui est une primary key dans une table ne devrait logiquement être dans l'autre qu'une clé étrangère, donc tu peux l'indexer, mais elle ne petu pas être unique si la cardinalité entre les deux tables est du type 1-n, c'est à dire 1 du coté où la clé est primaire et n coté clé étrangère. En revanche, celle où user est clé étrangère doit avoir un autre champ en clé primaire, en l'occurence id, user étant clé primaire dans ta table class_forza_2005
ok :)

bon, et pour ma requette, je fais comment , car là, j'en perd mon latin (que je ne connais pas d'ailleur :lol: :lol: )

Mammouth du PHP | 19672 Messages

10 juin 2005, 23:59

Quand tu as d'un coté une clé primaire et de l,autre ce même champ (même nom et même type de valeur), quand tu cherches des valeurs ayant ce point en commun, tu fais une jointure interne du genre

Code : Tout sélectionner

SELECT * FROM table1, table2 WHERE table1.cleprimaire = table2.cleetrangere;
Ça, c'est le schéma : note que la syntaxe ci-dessus est valide et obligatoire si les deux champs ont le même nom, sinon, il y aura ambiguïté et le SGBD va tordre le nez, donc on préfixe le nom du champ avec le nom de la table, comme ceci :

Code : Tout sélectionner

SELECT * FROM table1, table2 WHERE table1.users = table2.users;
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

sebf
Invité n'ayant pas de compte PHPfrance

11 juin 2005, 00:18

ok,
j'ai donc supprimer la primary key user de la table class_forza_2005

ensuite, j'ai fais cette requette :
$sql = "SELECT * FROM class_forza_2005, fiche_pilote WHERE class_forza_2005.user = fiche_pilote.user ORDER BY total DESC LIMIT 0,10";
Ca me retourne :
1. denca052 13
2. sebf webr 12
Donc, ca me donne que les users qui sont dans les 2 tables ( class_forza_2005 et fiche_pilote)
Or, je voudrais avoir tous les users qui sont dans class_forza_2005

Mammouth du PHP | 19672 Messages

11 juin 2005, 00:36

Bon, ok, tu veux tous les users de la table class_forza_2005: as-tu besoin de ceux de l,autre table ou non ? Par ce que si tu n'en as pas besoin obligatoirement pour la raison qu'ils sont de toute façon dans la première, alors on se fout de la jointure et tu fais ta requête que sur la table classe_forza_2005.

Mais si tu veux ce que correspond à l'un ET à l'autre, tu ne t'en sortiras pas autrement qu'en ayant ce qui est commun aux deux à l'exclusion des autres.

Je me demande si tu saisis bien le principe.

Pour illustrer, imagines que tu as deux boites: dans l'une, tu as une liste de trois marques de voitures: peugeot, opel, citroën; dans l'autre, tu as trois voitures: une c5, une coccinelle et une safrane. Si tu cherches les marques voitures dont tu as un exemplaire, tu ne sortiras que Citroën et Renault, mais dans les voitures tu n'as pas d'Opel et dans les marques, tu n'as pas Volskswagen. Donc soit tu veux tout d'un coté, soit tout de l'autre, soit ce qui est commun aux deux soit tu veux le tout, mais en acceptant d'avoir des valeurs NULL : partant de cet exemple, dis-nous donc ce que tu cherches et on te dira comment rédiger ta requête, tous les cas de figure sont possible à ce stade.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

sebf
Invité n'ayant pas de compte PHPfrance

11 juin 2005, 01:08

j'aimerai avoir TOUS les users de la table class_forza_2005, et pour les users qui sont present dans fiche_pilote, je voudrais avoir pour ceux là les champs "team" en plus

Ex:
class_forza_2005 :
dupond 34
rene 56
yves 21


fiche_pilote :
rene _ superteam

Je voudrais avoir :
rene superteam 56
dupond _ 34
yves _ 21

Mammouth du PHP | 19672 Messages

11 juin 2005, 01:38

Ok, alors voilà la requête :

Code : Tout sélectionner

SELECT t1.user, t1.total, t2.team FROM class_forza_2005 AS t1 LEFT JOIN fiche_pilote AS t2 ON t1.user = t2.user ORDER BY total;
Ce qui va donner comme résultat:

Code : Tout sélectionner

+--------------+----------+----------+ |user |total |team | +--------------+----------+----------+ |yves | 21|NULL | |dupond | 34|NULL | |rene | 56|superteam | +--------------+----------+----------+
En clair, tu as tous les pilotes de la table class_forza_2005 et leur team s'ils en ont un.

Est-ce que cette fois-ci ça correspond à ce que tu voulais ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

sebf
Invité n'ayant pas de compte PHPfrance

11 juin 2005, 01:55

IMPEC !!!!!!!!!!!!!!!!!!!


C'est exactement ca que je voulais !!!!!!!!!!!


MERCI, 10000000000000000000 MERCI a vous 3 !!!!!!!!!!!!!!!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

11 juin 2005, 10:51

Si il y plus de user dans la table "champ_forza" que dans la table "fiche_pilote", tu peut faire une requete SQL LEFT JOIN qui va sélectionner toute la table de gauche, qui va sélectionner ceux qui correspondent dans la table de droite et mettre NULL pour les autres :

Code : Tout sélectionner

SELECT * FROM champ_forza AS cf LEFT JOIN fiche_pilote AS fp ON cf.user=fp.user
C'est mon premier post, le 3eme de ce sujet à quelquechose comme 16h hier !!!

Maintenant regardez la réponse de Cyrano ...

sebf, ou comment perdre 9h alors que la réponse est sous ton nez

:langue:[/b]
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer