des infos venant de 2 tables

sebf
Invité n'ayant pas de compte PHPfrance

10 juin 2005, 16:04

Bonjours,

Voilà, je voudrais afficher des infos a partir de 2 tables.
CREATE TABLE `champ_forza` (
  `id` int(11) NOT NULL auto_increment,
  `date` datetime NOT NULL default '0000-00-00 00:00:00',
  `user` varchar(30) NOT NULL default '',
  `circuit` varchar(40) NOT NULL default '',
  `auto` varchar(40) NOT NULL default '',
  `classe` varchar(4) NOT NULL default '',
  `min` int(1) NOT NULL default '0',
  `sec` char(2) NOT NULL default '0',
  `mil` char(3) NOT NULL default '0',
  `tot_mil` int(10) NOT NULL default '0',
  `style` varchar(15) NOT NULL default '',
  `console` varchar(4) NOT NULL default '',
  `pays` varchar(20) NOT NULL default '',
  `stm` tinyint(1) NOT NULL default '0',
  `tcs` tinyint(1) NOT NULL default '0',
  `abs` tinyint(1) NOT NULL default '0',
  `boite` varchar(4) NOT NULL default '',
  `valid` int(1) NOT NULL default '0',
  `annee` int(4) NOT NULL default '0',
  `epreuve` int(2) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=41 ;
et
CREATE TABLE `fiche_pilote` (
  `user` varchar(50) NOT NULL default '',
  `team` varchar(15) NOT NULL default '',
  `victoire_gt4` char(2) NOT NULL default '',
  `podium_gt4` varchar(4) NOT NULL default '',
  `victoire_forza` char(2) NOT NULL default '',
  `podium_forza` varchar(4) NOT NULL default '',
  `victoire_tocard2` char(2) NOT NULL default '',
  `podium_tocard2` varchar(4) NOT NULL default ''
) TYPE=MyISAM;
voilà mes 2 tables

maintenant, je voudrais afficher les infos par user, mais sachant que la table 'fiche_pilote', tous les users n'y sont pas
$result = $db->sql_query("SELECT champ_forza.user, champ_forza.total, fiche_pilote.user, fiche_pilote.team FROM champ_forza, fiche_pilote WHERE champ_forza.user=fiche_pilote.user order BY total DESC LIMIT 0,10");
Le probleme, c'est que cette requette ne me donne que les users qui sont present dans les 2 tables :cry:

Comment faire pour avoir tous les users ?

Mammouth du PHP | 19672 Messages

10 juin 2005, 16:11

Selon ta requête, tu vérifie une condition, à savoir qu'on a dans une table un élément correspondant dans l'autre table, donc forcément, si la condition n'est pas vérifiée, tu n'auras pas ceux qui ne sont que d'un coté

Je signale aussi que tu fais un ORDER BY sur un champ inexistant (total)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 juin 2005, 16:18

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
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

sebf
Invité n'ayant pas de compte PHPfrance

10 juin 2005, 16:43

Merci zeus et cyrano , ca m'avance beaucoup :wink:

Maintenant, ca me donne bien tous mes enregsitrements, seul probleme, c'est que les users ne sont plus marqué pour ceux qui ne sont que dans la table class_forza_2005

Code : Tout sélectionner

1. 18 2. denca052 13 3. sebf webr 12 4. 7 5. 6 6. 6 7. 5 8. 2 9. 1
voici mon code (attention, j'ai changé de table par rapport a mon 1er message, car en effet, je faisait une jointure avec une mauvaise table ...)
$result = $db->sql_query("SELECT * FROM class_forza_2005 AS cf LEFT JOIN fiche_pilote AS fp ON cf.user=fp.user order BY total DESC LIMIT 0,10");
echo '<table CELLPADDING="1" CELLSPACING="0"><tr><td></td><td>Pilote</td><td>tot</td></tr>';
$a = 1;
while($data = mysql_fetch_array($result))
    {
$b = $a++;
    echo "<tr><td><B>$b</B>. </td>";
    echo '<td>'.$data['user'].'</td><td>'.$data['team'].'</td><td>'.$data['total'].' </td></tr>';
    } 
echo '</table>';

Mammouth du PHP | 19672 Messages

10 juin 2005, 16:53

Comment vous faites pour relire vos propres codes les copains, ça m'épate toujours:
<?php
$sql = "SELECT * FROM class_forza_2005 AS cf LEFT JOIN fiche_pilote AS fp ON cf.user=fp.user order BY total DESC LIMIT 0,10";
$result = $db->sql_query($sql);
?>
<table CELLPADDING="1" CELLSPACING="0">
  <tr>
    <td>&nbsp;</td>
    <td>Pilote</td>
    <td>tot</td>
  </tr>
<?php
$a = 1;
while($data = mysql_fetch_array($result))
    {
        $b = $a++;
?>
  <tr>
    <td><B>$b</B>. </td>
    <td><?php echo($data['user']); ?></td>
    <td><?php echo($data['team']); ?></td>
    <td><?php echo($data['total']); ?></td>
  </tr>
<?php
    }
?>
</table>
Pensez-ce que vous voulez, je suis tatillon peut-être mais bon sang, c'est plus facile à lire comme ça non ???

Bon et il est où alors le problème ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 juin 2005, 16:59

Je rejoint entièrement Cyrano, un code clair est enormément plus facile à coriger, débugger et faire évoluer

Sinon, et comme je te l'ai dit dans mon post précédent, avec LEFT JOIN, si tu as des enregistrements dans la table de gauche qui ne sont pas dans la table de droite, tu auras NULL.

C'est donc normal qu'il y ait des vases de vides. Surtout que c'est toi qui nous as dit ça
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

sebf
Invité n'ayant pas de compte PHPfrance

10 juin 2005, 17:20

oups, desolé pour le code, j'ai tjs fais comme ca ...... sorry, je vais essayer de coder comme vous dites :wink:

Bon, j'ai du mal m'exprimé.
Je n'ai pas d'user vide.

Dans la table class_forza_2005, j'ai des users qui ont des points (total)
Dans la table fiche_pilote, j'ai des users qui sont dans un team

Je voudrais donc afficher le classement de tous les users (class_forza_2005) avec en plus pour info le team (s'ils en ont un) (fiche_pilote)

C'est plus clair ? :wink:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 juin 2005, 17:25

A quoi correspond class_forza_2005 ?

Elle contient quoi ?

Tu as un champs contenent le nombre de point ou c'est à calculer ?
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

sebf
Invité n'ayant pas de compte PHPfrance

10 juin 2005, 17:31

CREATE TABLE `class_forza_2005` (
  `user` varchar(30) NOT NULL default '',
  `m1` tinyint(2) NOT NULL default '0',
  `m2` tinyint(2) NOT NULL default '0',
  `m3` char(2) NOT NULL default '',
  `m4` tinyint(2) NOT NULL default '0',
  `m5` char(2) NOT NULL default '',
  `m6` char(2) NOT NULL default '',
  `m7` char(2) NOT NULL default '',
  `m8` char(2) NOT NULL default '',
  `total` int(3) NOT NULL default '0'
) TYPE=MyISAM;
Le champ qui contient tous les points est 'total'

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 juin 2005, 17:41

Si tu es sûr que tout les users de class_forza_2005 ont une correspondance dans fiche_pilote, tu n'as qu'a faire :

Code : Tout sélectionner

SELECT user, team, total FROM fiche_pilote AS fp JOIN class_forza_2005 AS cf ON fp.user=cf.user ORDER BY total
Ca t'affichera tout les pilotes avec leur nombres de points et leur team si il a en une

Si tu as des pilotes qui n'ont pas de points, fait

Code : Tout sélectionner

SELECT user, team, total FROM class_forza_2005 AS cf LEFT JOIN fiche_pilote AS fp ON fp.user=cf.user ORDER BY total
Ca t'afficheras tous les pilotes qui ont un total de point
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

sebf
Invité n'ayant pas de compte PHPfrance

10 juin 2005, 17:51

non, le probleme est que tous les pilotes de class_forza_2005 non pas une correspondance dans fiche_pilote

seulement 2 (pour le moment) on cette correspodance.

ce qu'il faudrait, c'est afficher tous les users de class_forza_2005 et si il y a une correspondance dans fiche_pilote, dans ce cas afficher la 'team' pour ces pilotes

ViPHP
pjl
ViPHP | 2119 Messages

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à ?

sebf
Invité n'ayant pas de compte PHPfrance

10 juin 2005, 20:53

oui,

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

ViPHP
pjl
ViPHP | 2119 Messages

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.

sebf
Invité n'ayant pas de compte PHPfrance

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"