Page 1 sur 2

des infos venant de 2 tables

Posté : 10 juin 2005, 16:04
par sebf
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 ?

Posté : 10 juin 2005, 16:11
par Cyrano
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)

Posté : 10 juin 2005, 16:18
par zeus
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

Posté : 10 juin 2005, 16:43
par sebf
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>';

Posté : 10 juin 2005, 16:53
par Cyrano
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 ?

Posté : 10 juin 2005, 16:59
par zeus
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

Posté : 10 juin 2005, 17:20
par sebf
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:

Posté : 10 juin 2005, 17:25
par zeus
A quoi correspond class_forza_2005 ?

Elle contient quoi ?

Tu as un champs contenent le nombre de point ou c'est à calculer ?

Posté : 10 juin 2005, 17:31
par sebf
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'

Posté : 10 juin 2005, 17:41
par zeus
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

Posté : 10 juin 2005, 17:51
par sebf
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

Posté : 10 juin 2005, 19:59
par pjl
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à ?

Posté : 10 juin 2005, 20:53
par sebf
oui,

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

Posté : 10 juin 2005, 22:55
par pjl
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.

Posté : 10 juin 2005, 22:58
par sebf
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"