des infos venant de 2 tables

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 : des infos venant de 2 tables

par zeus » 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]

par sebf » 11 juin 2005, 01:55

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


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


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

par Cyrano » 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 ?

par sebf » 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

par Cyrano » 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.

par sebf » 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

par Cyrano » 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;

par sebf » 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: )

par Cyrano » 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

par sebf » 10 juin 2005, 23:18

PRIMARY KEY (`user`)

ca y est pour mes 2 tables

par pjl » 10 juin 2005, 23:07

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

par sebf » 10 juin 2005, 22:58

super tes reponses :?

OUI mais infos ne sont que dans une table est une seule (regarde les messages au dessus et tu verras)

OUI j'ai une cle primaire "user"

par pjl » 10 juin 2005, 22:55

Quelques rappels sur les bases de données :
- un élèment ne doit y être stocké qu'une et une seule fois
- toute tale doit être défini par une clef primaire. Cette clef primaire est un identifiant unique, le plus souvent sous forme numérique.

Avec ces 2 élèments, relis ma question précédente et regarde tes tables.
Tu devrais rapidement trouver la solution à ton problème.

par sebf » 10 juin 2005, 20:53

oui,

les users peuvent etre dans class_forza_2005
ou etre dans class_forza_2005 et dans fiche_pilote

par pjl » 10 juin 2005, 19:59

Ce n'est pas clair ton truc.

Tu as des users.
Ces users peuvent être pilote ou forzza ou pilote et forzza, c'est celà ?