Jointure entre deux tables - ne fonctionne pas

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 : Jointure entre deux tables - ne fonctionne pas

Re: Jointure entre deux tables - ne fonctionne pas

par armenfrast » 30 oct. 2010, 18:04

Merci pour avoir pris le temps de tout recoder je vais regarder ton exemple de plus près.

En fait ta première recommandation m'a fourni la réponse. A savoir tester la requête avec PHP My Admin.

L'une des table était codée en UTF8_Unicode et l'autre en UTF_General.

Je suis un peu confus de ne pas y avoir pensé avant, mais je n'avais jamais réalisé que les messages d'erreur étaient si explicites dans PMA

Sincèrement

Re: Jointure entre deux tables - ne fonctionne pas

par Cyrano » 30 oct. 2010, 16:43

As-tu testé ta requête directement avec phpMyAdmin ou un outil similaire ?

Par ailleurs, indiquer « ça ne marche pas » est très insuffisant comme indication : ne voyant pas le résultat, on ne pourra pas deviner.

Enfin, le code de sortie HTML est très discutable : du <div> à chaque tour, ce n'est sémantiquement pas valable même si c'est valide au plan de la norme.

Et pour ta jointure, je suggère une jointure normalisée au lieu d'une clause WHERE. Suggestion globale :
<?php
$sql  = "SELECT ".
        "  m.ville, ".
        "  p.pays_clair ".
        "FROM membres m ".
        "  INNER JOIN pays p ON m.codepays = p.id_pays ".
        "WHERE m.cpostal <> '' ".
        "ORDER BY p.id_pays, m.ville";
$result = mysql_query($sql);
$descr = "<div>\n";
$sPays = '';
$np = mysql_num_rows($result);
$i = 1;
while(false !== ($row = mysql_fetch_assoc($result)))
{
    if($sPays != $row['pays_clair'])
    {
        if($i > 1)
        {
            $descr .= "  </p>\n";
        }
        $sPays = $row['pays_clair'];
        $descr .= "  <h4>". ucwords(strtolower($row['pays_clair'])) ."</h4>\n  <p>\n";
    }
    $descr .= "    ". ucwords(strtolower($row['ville'])) ."<br />\n";
    $i++;
}
$descr .= "  </p>\n</div>\n";
echo($descr);
?>
Je te laisse analyser un peu tout ça, tu devrais y trouver pas mal de choses intéressantes.

Jointure entre deux tables - ne fonctionne pas

par armenfrast » 30 oct. 2010, 16:04

Première table: Membres. Le Pays est codé en ISO. Par ex FR pour France
Deuxième table: Correspondance code ISO avec l'intitulé FR, France

La solution actuelle qui fonctionne
<?
$sql="SELECT ville,codepays FROM membres WHERE cpostal<>''";
$result=mysql_query($sql);
while ($row = mysql_fetch_array($result)){

//Recherche du Pays ($pays)
$sql="SELECT id_pays,pays_clair FROM `pays` WHERE id_pays ='$row[codepays]'" ;
$liste=mysql_query($sql);
$pays = mysql_fetch_array($liste);

$descr=ucwords(strtolower($row['ville']))."<br/>".ucwords(strtolower($pays['pays_clair']));
echo ("<div>$descr</div>\n");
}
?>
Théoriquement je devrais pouvoir tout agréger en une seule ligne ? mais la 2e requête ne fonctionne pas - pourquoi ?
<?
$sql="SELECT membres.ville,membres.codepays,pays.id_pays,pays.pays_clair FROM membres,pays WHERE cpostal<>'' AND membres.codepays=pays.id_pays";
$result=mysql_query($sql);
while ($row = mysql_fetch_array($result)){

$descr=ucwords(strtolower($row['ville']))."<br/>".ucwords(strtolower($row['pays_clair']));
echo ("<div>$descr</div>\n");
}
?>