Auteur Sujet: Jointure Externe  (Lu 1324 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Arnaud41

  • Débutant
  • *
  • Messages: 30
Jointure Externe
« le: 15 février 2004 à 22:34:46 »
Salut tout le monde.
 
Une petite question surement toute bête mais qui agace un petit peu le débutant que je suis.
Dans la requete ci-dessous je ramène un certain nombre d'infos d'une table en fonction de ce qui a été entré dans un formulaire.
 
SELECT cps1,cps2,cps3,cps4
FROM table
WHERE cps1='$form1' and cps2='form2'


Mais dans le formulaire je laisse la possibilité à l'internaute de choisir cps1 et cps2 mais aussi de ne pas préciser cps2 (option "indifférent" dans la liste déroulante). Mais comment coder ce cas de figure dans ma requete ? Avec oracle j'aurais utilisé une jointure externe mais avec MySQL je sèche. Il doit y avoir la meme chose mais j'ai pas trouvé de doc avec ce cas de figure.
Si quelqu'un peut m'aider je suis preneur.
 
Arnaud
 
 
 
 

Hors ligne tooms

  • Débutant
  • *
  • Messages: 62
Jointure Externe
« Réponse #1 le: 15 février 2004 à 23:06:52 »
si j'ai bien compris...
SELECT cps1,cps2,cps3,cps4
FROM table
WHERE (cps1='$form1' and cps2='form2') or (cps1='$form1' and cps2='')

Hors ligne Arnaud41

  • Débutant
  • *
  • Messages: 30
Jointure Externe
« Réponse #2 le: 16 février 2004 à 15:57:45 »
mmmm oui mais non

parce que là j'ai simplifié l'exemple mais des champs de formulaire non obligatoire j'en ai beaucoup (en fait tous les champs sont facultatif).  :blink:

donc une jointure externe me semble plus appropriée.

Hors ligne Un peu neuneu

  • Débutant
  • *
  • Messages: 100
Jointure Externe
« Réponse #3 le: 16 février 2004 à 22:20:49 »
Salut,

Moi j'ai plein de formulaire dans ce cas .. Alors j'ai finalement préféré coder la requête SQL en PHP en examinant la conf qui me parvient du formulaire.

Exemple ci-dessous (les $choix, $type, $etat, etc. sont des valeurs de formulaire. Si j'étais plus rigoureux j'aurais donn $_POST['etat'] mais je suis un peu flemmard  :rolleyes: :

if ($_GET["choix"])
{
    //Si on vient du formulaire de sélection
    $choix = $_GET["choix"];
    //On fixe le select (identique pour tous les choix)
    $select = "SELECT t_packs.id as idtrav, t_packs.date_em as date_em, t_packs.etat as etat, t_packs.type as type,
    t_packs.date_tr as date_tr, t_packs.num as num, t_packs.idc as idc, clients.rs as rs  , clients.mail1 as mail,
    admin.nom as adm, admin.mail as adm_mail
    FROM t_packs
    INNER JOIN clients ON t_packs.idc = clients.id
    LEFT JOIN admin ON t_packs.adm = admin.id";
    if ($choix == "1")
    {
        //Recherche des travaux créés depuis la dernière connexion
        $d1 = substr($d_cnx, 0, 10);
        $d2 = date("Y-m-d");
        $where = " WHERE t_packs.date_em >= '$d1'";
        $msg_info = "Liste des travaux demandés depuis le <b>" .maj_date($d1,'s') ."</b>.";
    }
    if ($choix == "3")
    {
        //Si on a choisi une liste personnalisée
        //on construit la requête sur la base des données transmises
        $msg_info = "Liste des travaux ";
        if ($client != "0")
        {
            //Si on a sélectionné un client
            if (!$where){$where = " WHERE";}else{$where .= " AND";}
            $where .= " clients.id = '$client'";
            $rs = mysql_result(@mysql_query("SELECT rs FROM clients WHERE id = '$client'"),0,"rs");
            $msg_info .= " du client <b>".$rs."</b>,";
        }
        if ($type != "0")
        {
            //Si on a sélectionné un type
            if ($type == "1")
            {
                $ntype = "Photo Conversion";
            }
            if ($type == "2")
            {
                $ntype = "Photo Scanning";
            }
            if ($type == "3")
            {
                $ntype = "Mise à jour";
            }
            if (!$where){$where = " WHERE";}else{$where .= " AND";}
            $where .= " t_packs.type = '$type'";
            $msg_info .= " de type <b>".$ntype."</b>,";
        }
        if ($etat != "0")
        {
            //Si on a sélectionné un état
            if ($etat == "EM")
            {
                $netat = "En attente de prise en charge";
            }
            if ($etat == "EC")
            {
                $netat = "En cours de traitement";
            }
            if ($etat == "RJ")
            {
                $netat = "Rejetés";
            }
            if ($etat == "FI")
            {
                $netat = "Terminés";
            }
            if (!$where){$where = " WHERE";}else{$where .= " AND";}
            $where .= " t_packs.etat = '$etat'";
            $msg_info .= " dans l'état <b>".$netat."</b>,";
        }
        if ($ddc != '')
        {
            //Si on indique une date de début de commande de travaux
            $ddc1 = maj_date($ddc,'rs');
            if (!$where){$where = " WHERE";}else{$where .= " AND";}
            $where .= " t_packs.date_em >= '$ddc1'";
            if ($dfc != '')
            {
                //et une date de fin de commande de travaux
                $dfc1 = maj_date($dfc,'rs');
                $where .= " AND t_packs.date_em <= '$dfc1'";
                $msg_info .= " commandés entre le <b>".$ddc."</b> et le <b>".$dfc."</b>,";
            }
            else
            {
                $msg_info .= " commandés depuis le <b>".$ddc."</b>,";
            }
        }
        if ($dfc != '' && $ddc == '')
        {
            //si on indique seulement une date de fin de commande de travaux
            $dfc1 = maj_date($dfc,'rs');
            if (!$where){$where = " WHERE";}else{$where .= " AND";}
            $where .= " t_packs.date_em <= '$dfc1'";
            $msg_info .= " commandés jusqu'au <b>".$ddc."</b>,";
        }
        if ($ddm != '')
        {
            //Si on indique une date de début de fin de travaux
            $ddm1 = maj_date($ddm,'rs');
            if (!$where){$where = " WHERE";}else{$where .= " AND";}
            $where .= " t_packs.date_rea >= '$ddm1'";
            if ($dfm != '')
            {
                //et une date de fin de fin de travaux
                $dfm1 = maj_date($dfm,'rs');
                $where .= " AND t_packs.date_rea <= '$dfm1'";
                $msg_info .= " terminés entre le <b>".$ddm."</b> et le <b>".$dfm."</b>,";
            }
            else
            {
                $msg_info .= " terminés depuis le <b>".$ddm."</b>,";
            }
        }
        if ($dfm != '' && $ddm == '')
        {
            //si on indique seulement une date de fin de fin de travaux
            $dfm1 = maj_date($dfm,'rs');
            if (!$where){$where = " WHERE";}else{$where .= " AND";}
            $where .= " t_packs.date_rea <= '$dfm1'";
            $msg_info .= " terminés jusqu'au <b>".$ddc."</b>,";
        }
    }
    $order = " ORDER BY t_packs.date_em DESC";
    $query = $select.$where.$order;
    //echo $query;
    $liste = @mysql_query($query) or die(err_cnx(mysql_error()));
 

C'est un peu long à faire mais à la fin tu as une belle requête toute propre qui surcharge pas trop la base
Ce qui est utile au plus grand nombre l'emporte sur les désirs d'un seul !

CaniHome

Hors ligne Arnaud41

  • Débutant
  • *
  • Messages: 30
Jointure Externe
« Réponse #4 le: 17 février 2004 à 16:30:18 »
Ca me parait bien complexe et en meme temps ca me parait plutot pas mal du tout.
je vais essayer.
merci beaucoup !

Hors ligne Patanock

  • Connaisseur
  • ***
  • Messages: 277
    • http://www.potoland.com
Jointure Externe
« Réponse #5 le: 17 février 2004 à 17:56:10 »
tu peux faire des jointure externe avec LEFT JOIN

Ex :

select M.*, IF(ISNULL(U.ID), 'NON', 'OUI') as REPONDRE from MESSAGES M left join UTILISATEURS U on M.ID_EXP = U.ID where M.ID_DEST=1


Ca selectionne tous les message de la table MESSAGES dont l'utilisateur d'ID 1 est le destinataire même si l'expediteur n'existe plus dans la table UTILISATEURS
« Modifié: 17 février 2004 à 17:59:59 par Patanock »

Si vous cherchez une communauté et un tchat sympa, venez visiter le site qui déchire !!


Hors ligne Green Hornet

  • ex mutualisé PHPNET
  • Habitué
  • **
  • Messages: 223
    • Tours Volley Ball
Jointure Externe
« Réponse #6 le: 18 février 2004 à 16:33:46 »
oups désolé de ne pas t'avoir répondu Arnaud, mais F1X m'a occupé mes soirées ;)