SELECT sur 2 tables, nb colonnes !=

Résolu
Bonjour,

2 tables t1 et t2
données = d

dans la 1ere j'ai besoin de plusieurs données dont 2 doivent être DISTINCT

SELECT DISTINCT t1.d1 , t1.d2

mais aussi d'autres données de cette table mais qui ne doivent pas être distinct

SELECT t1.d3, t1.d4, t1.d5

mais aussi de faire un select sur la 2eme table avec 3 données

SELECT t2.d1 , t2.d2, t2.d3

En résumé :
SELECT DISTINCT t1.d1 , t1.d2 FROM t1
SELECT t1.d3, t1.d4, t1.d5 FROM t1
SELECT t2.d1 , t2.d2, t2.d3 FROM t1, t2 WHERE t1.d5 = t2.d1 AND t2.d2 = "toto" AND t2.d3 ="tutu"

Est - ce clair ?
Est - ce possible en une seule requête car le résultat de cette requête est écrit dans un fichier texte que j'envoie ensuite par mail !

Merci d'avance
Configuration: Windows XP / Firefox 3.6
wamp
phpmyadmin 3.2.0.1
Mysql 5.1
PHP 5.3

27 réponses

Résumé de la discussion

La problématique porte sur l'exécution d'une requête SQL qui combine deux tables t1 et t2 pour obtenir des colonnes distinctes et non distinctes, puis d'écrire le résultat dans un fichier texte. Des propositions préconisent d'utiliser des jointures entre t1 et t2 et d'appliquer DISTINCT sur les champs requis, ou bien d'exécuter deux requêtes et d'assembler les résultats côté serveur. Certaines réponses illustrent des scripts qui itèrent sur les résultats et écrivent dans un fichier texte par entité, tandis que d'autres suggèrent d'intégrer les résultats dans une seule requête complexe. En pratique, la solution la plus robuste consiste souvent à s'assurer que la requête finale couvre toutes les combinaisons nécessaires et à éviter les doublons lors de l'écriture dans le fichier.

Bobot (l’IA à votre service)
  1. Encore un énorme MERCI tout fonctionne parfaitement !!

    Bonne fin de journée
    0
    1. Tant mieux,

      Bonne continuation
      0
  2. MILLES EXCUSES
    mais j'en ai plein le citron là lol
    j'avais une erreur dans ma requête voila pkoi la page elle ne trouvait rien !

    Et bien tu sais koi
    MMMMMMMMEEEEEEEEEERRRRRRRRRRCCCCCCCCCIIIIIIIIII !!!!!!!!!!!!
    BOCOUP
    BOCOUP

    je le met pas tout de suite à résolu je vais le tester dans ma fonction mail avant LOL

    un grand grand merci après 2 semaines de galere MERCI !!
    0
    1. Quand exécute la page PHP, tu as une erreur ou juste une page blanche ?

      tu peux essayer de quelques "echo" dans la page afin de débugger...
      0
      1. J'ai testé en simulant les appels SQL et ca a l'air de marcher avec le code suivant :
        
        $today = date("Y-m-d");
        
        
        
        $req1 = "SELECT DISTINCT EmailENTITE,ENTITE FROM ua
        JOIN notifications ON ua.AdresseIP = notifications.AdresseIP
        WHERE notifications.ETAT='1' AND notifications.DateUA = '$today'";
        
        $res1 = mysql_query($req1) or die('Erreur SQL !<br />' . $req1 . '<br />' . mysql_error());
        
        //Récuperation des résultats
        
        while ($rowTitle = mysql_fetch_row($res1)){
        
        $mailentTitle = $rowTitle[0];
        $entiteTitle = $rowTitle[1];
        
        echo" <br/>
        <br/>MAIL ENTITE : $mailentTitle
        <br/>ENTITE : $entiteTitle
        <br/>
        ";
        
        $fp = fopen("$entiteTitle.txt","a");
        
        fwrite($fp, "\nNOM NETBIOS");
        fwrite($fp, "\tSOURCE");
        fwrite($fp, "\tADRESSE IP");
        fwrite($fp, "\tMAIL ENTITE");
        fwrite($fp, "\tENTITE");
        fwrite($fp, "\tSITE");
        fwrite($fp, "\tDATEUA");
        fwrite($fp, "\tETAT");
        
        
        
        $req2 = "SELECT '$mailentTitle','$entiteTitle',ua.NomNetbios,ua.SourceMAJ,ua.AdresseIP,ua.SITE,notifications.DateUA,notifications.ETAT FROM ua
        JOIN notifications
        ON ua.AdresseIP = notifications.AdresseIP
        AND notifications.ETAT='1' AND notifications.DateUA = '$today'
        WHERE ENTITE = '$entiteTitle'
        AND EmailENTITE = '$mailentTitle'";
        
        $res2 = mysql_query($req2) or die('Erreur SQL !<br />' . $req2 . '<br />' . mysql_error());
        
        
        //Récuperation des résultats
        while ($row = mysql_fetch_row($res2)){
        
        $mailent = $row[0];
        $entite = $row[1];
        $netbios = $row[2];
        $source = $row[3];
        $ip = $row[4];
        $site = $row[5];
        $date = $row[6];
        $eta = $row[7];
        
        
        $hl = "Hors Ligne";
        $etat=STR_REPLACE("1","$hl","$eta");
        
        echo" <br/>
        <br/>MAIL ENTITE : $mailent
        <br/>ENTITE : $entite
        <br/>NOM NETBIOS : $netbios
        <br/>SOURCE MAJ : $source
        <br/>ADRESSE IP : $ip
        <br/>SITE : $site
        <br/>DATE : $date
        <br/>ETAT : $etat
        <br/>
        ";
        
        
        
        
        fwrite($fp, "\n$netbios");
        fwrite($fp, "\t$source");
        fwrite($fp, "\t$ip");
        fwrite($fp, "\t$mailent");
        fwrite($fp, "\t$entite");
        fwrite($fp, "\t$site");
        fwrite($fp, "\t$date");
        fwrite($fp, "\t$etat");
        
        
        }
        
        fclose($fp);
        
        
        }
        
        

        0
        1. Bah t'as de la chance lol j'ai toujours rien
          0
      2. Bonjour,

        Merci c'est sympa
        Mais maintenant je n'ai plus aucun affichage ni aucun fichier de crées j'ai essayé plusieurs modif et rien !
        0
        1. J'ai pas eu le temps de regarder hier :p

          Ton problème viens du fait que la requête 2 doit être faite sur chacun des résultats de la requête 1
          (les corrections en gras) (il suffit de déplacer la parenthèse fermante du while de la requête 1 en fait)

          $today = date("Y-m-d");
          
          
          
          $req1 = "SELECT DISTINCT EmailENTITE,ENTITE FROM ua
          JOIN notifications ON ua.AdresseIP = notifications.AdresseIP
          WHERE notifications.ETAT='1' AND notifications.DateUA = '$today'";
          
          $res1 = mysql_query($req1) or die('Erreur SQL !<br />' . $req1 . '<br />' . mysql_error());
          
          //Récuperation des résultats
          while ($rowTitle = mysql_fetch_row($res1)){
          $mailentTitle = $rowTitle [0];
          $entiteTitle = $rowTitle [1];
          
          echo" <br/>
          <br/>MAIL ENTITE : $mailentTitle
          <br/>ENTITE : $entiteTitle
          <br/>
          ";
          
          
          $fp = fopen("$entiteTitle.txt","a");
          
          fwrite($fp, "\nNOM NETBIOS");
          fwrite($fp, "\tSOURCE");
          fwrite($fp, "\tADRESSE IP");
          fwrite($fp, "\tMAIL ENTITE");
          fwrite($fp, "\tENTITE");
          fwrite($fp, "\tSITE");
          fwrite($fp, "\tDATEUA");
          fwrite($fp, "\tETAT");
          
          
          $req2 = "SELECT '$mailent','$entite',ua.NomNetbios,ua.SourceMAJ,ua.AdresseIP,ua.SITE,notifications.DateUA,notifications.ETAT FROM ua
          JOIN notifications
          ON ua.AdresseIP = notifications.AdresseIP
          AND notifications.ETAT='1' AND notifications.DateUA = '$today'
          WHERE ENTITE = '$entiteTitle'
          AND EmailENTITE = '$mailentTitle '";
          
          $res2 = mysql_query($req2) or die('Erreur SQL !<br />' . $req2 . '<br />' . mysql_error());
          
          
          
          
          //Récuperation des résultats
          while ($row = mysql_fetch_row($res2)){
          $mailent = $row[0];
          $entite = $row[1];
          $netbios = $row[2];
          $source = $row[3];
          $ip = $row[4];
          $site = $row[5];
          $date = $row[6];
          $eta = $row[7];
          
          
          $hl = "Hors Ligne";
          $etat=STR_REPLACE("1","$hl","$eta");
          
          echo" <br/>
          <br/>MAIL ENTITE : $mailent
          <br/>ENTITE : $entite
          <br/>NOM NETBIOS : $netbios
          <br/>SOURCE MAJ : $source
          <br/>ADRESSE IP : $ip
          <br/>SITE : $site
          <br/>DATE : $date
          <br/>ETAT : $etat
          <br/>
          ";
          
          
          
          
          
          fwrite($fp, "\n$netbios");
          fwrite($fp, "\t$source");
          fwrite($fp, "\t$ip");
          fwrite($fp, "\t$mailent");
          fwrite($fp, "\t$entite");
          fwrite($fp, "\t$site");
          fwrite($fp, "\t$date");
          fwrite($fp, "\t$etat");
          }
          
          fclose($fp);
          
          }
          


          J'ai pas testé donc c'est peu-être perfectible.
          0
          1. Un p'tit UP svp !
            juste pour me dire s'il manque quelque chose ou si mon code est completement faux !

            Merci d'avance
            0
            1. Je te remercie je récupère bien les données dont j'ai besoin cependant j'ai un dernier soucis, je n'ai qu'un seul fichier texte de créer au lieu de 3 en fonction de mes entité qui bug !
              Est ce que tu serais me dire comment faire ?
              je t'ai mis mon code si tu as un peu de temps!
              Merci d'avance

              $today = date("Y-m-d");

              $req1 = "SELECT DISTINCT EmailENTITE,ENTITE FROM ua
              JOIN notifications ON ua.AdresseIP = notifications.AdresseIP
              WHERE notifications.ETAT='1' AND notifications.DateUA = '$today'";

              $res1 = mysql_query($req1) or die('Erreur SQL !<br />' . $req1 . '<br />' . mysql_error());

              //Récuperation des résultats
              while ($row = mysql_fetch_row($res1)){
              $mailent = $row[0];
              $entite = $row[1];

              echo" <br/>
              <br/>MAIL ENTITE : $mailent
              <br/>ENTITE : $entite
              <br/>
              ";
              }

              $req2 = "SELECT '$mailent','$entite',ua.NomNetbios,ua.SourceMAJ,ua.AdresseIP,ua.SITE,notifications.DateUA,notifications.ETAT FROM ua
              JOIN notifications
              ON ua.AdresseIP = notifications.AdresseIP
              AND notifications.ETAT='1' AND notifications.DateUA = '$today'
              WHERE ENTITE = '$entite'
              AND EmailENTITE = '$mailent'";

              $res2 = mysql_query($req2) or die('Erreur SQL !<br />' . $req2 . '<br />' . mysql_error());

              //Récuperation des résultats
              while ($row = mysql_fetch_row($res2)){
              $mailent = $row[0];
              $entite = $row[1];
              $netbios = $row[2];
              $source = $row[3];
              $ip = $row[4];
              $site = $row[5];
              $date = $row[6];
              $eta = $row[7];

              $hl = "Hors Ligne";
              $etat=STR_REPLACE("1","$hl","$eta");

              echo" <br/>
              <br/>MAIL ENTITE : $mailent
              <br/>ENTITE : $entite
              <br/>NOM NETBIOS : $netbios
              <br/>SOURCE MAJ : $source
              <br/>ADRESSE IP : $ip
              <br/>SITE : $site
              <br/>DATE : $date
              <br/>ETAT : $etat
              <br/>
              ";

              $fp = fopen("$entite.txt","a");

              fwrite($fp, "\nNOM NETBIOS");
              fwrite($fp, "\tSOURCE");
              fwrite($fp, "\tADRESSE IP");
              fwrite($fp, "\tMAIL ENTITE");
              fwrite($fp, "\tENTITE");
              fwrite($fp, "\tSITE");
              fwrite($fp, "\tDATEUA");
              fwrite($fp, "\tETAT");

              fwrite($fp, "\n$netbios");
              fwrite($fp, "\t$source");
              fwrite($fp, "\t$ip");
              fwrite($fp, "\t$mailent");
              fwrite($fp, "\t$entite");
              fwrite($fp, "\t$site");
              fwrite($fp, "\t$date");
              fwrite($fp, "\t$etat");

              fclose($fp);

              }
              0
              1. Pour la 2eme requête, j'ai oublié de mettre la condition sur l'entité :
                SELECT 
                t1.NomNetbios,
                t1.AdresseIP, 
                t1.SITE
                FROM Table1 t1
                JOIN Table2 t2 ON t1.AdresseIP =t2.AdresseIP AND t2.ETAT=1 AND t2.DateUA = CURRENT DATE 
                WHERE ENTITE=$entite_php
                
                


                la première requête te donne le destinataire et le titre de ton mail.

                Dans le corps, tu mets le résultat de la 2eme requête.
                0
                1. Oui merci
                  Mais comment fait on pour écrire les résultats de ces 2 requêtes dans un même fichier texte ??
                  C'est pourquoi je ne voulait en faire qu'une seule afin d'écrire le résultat dans le fichier texte en fonction de l'entité et l'envoyer
                  0
                  1. C'est un peu plus clair avec le cas concret.
                    Tu veux envoyer à chaque entité la liste de leur serveurs qui ne répondent pas au ping ?
                    Si tu crées un fichier texte par entité, il faut effectivement que tu fasse plusieurs requêtes...

                    Dans un premier temps, tu récupères la liste des entités à qui il faut envoyer un mail :
                    SELECT DISTINCT
                    ENTITE,
                    EmailENTITE 
                    FROM Table1 t1
                    JOIN Table2 t2 ON t1.AdresseIP =t2.AdresseIP AND t2.ETAT=1 AND t2.DateUA = CURRENT DATE 
                    


                    Ensuite, pour chacune de ces entités, tu récupères la liste des serveurs qui ne répondent pas :
                    SELECT 
                    t1.NomNetbios,
                    t1.AdresseIP, 
                    t1.SITE
                    FROM Table1 t1
                    JOIN Table2 t2 ON t1.AdresseIP =t2.AdresseIP AND t2.ETAT=1 AND t2.DateUA = CURRENT DATE 
                    


                    0
                    1. 1ere Table :

                      NomNetbios SourceMAJ AdresseIP EmailENTITE ENTITE SITE
                      toto aaaa.fr 1.2.3.4 support-mess@nantes.fr nantes orvault
                      tata bbbb.fr 5.6.7.8 support-mess@nantes.fr nantes carquefou
                      tutu cccc.fr 9.10.11.12 support-mess@rennes.fr rennes cleunay

                      2eme Table :

                      AdresseIP SourceMAJ DateUA ETAT (=résultat PING du jour)
                      1.2.3.4 aaaa.fr 2010-02-23 1
                      5.6.7.8 bbbb.fr 2010-02-23 0
                      9.10.11.12 cccc.fr 2010-02-23 1

                      Donc j'ai +sieurs fois le meme email et la meme entite
                      je dois récupérer toutes les infos de la 1ere table SI l'adresseIP de la 1ere est dans la 2eme que la date est la date du jour et que son etat et KO c'est à dire = à 1.

                      dans a 2eme table je vais avoir aussi des données des dates précédente avec les mêmes adresses IP et source qui ont été pinguer les jours précedents.

                      Il faut donc que je récupère qu'une seule fois le mail ainsi que l'entite car mon fichier portera le nom de l'entité et enverra au mail correspondant.
                      Une Entité peut avoir plusieurs IP
                      donc je vais pas envoyé 10 fois un mail avec une IP différente je voudrais tout regrouper !!

                      c'est un peu plus clair ou trop compliqué ?
                      0
                      1. Pour rejoindre le post 3 de Garion28, peux-tu nous donner un exemple des lignes de tes tables avec le résultat attendu ?
                        Cela permettrai de mieux comprendre ce que tu cherches vraiment.

                        Je pense quand même qu'il vaut mieux faire une seule requête, même si elle est un peu plus complexe plutôt que de faire un traitement php derrière...
                        0
                        1. si tu ne fait qu'une requète, alors tout les champs du select seront soumis aux conditions.

                          il y a ptete une solution avec des requètes multiple (genre requète imbriqué), mais vu la complexité tu ferai pareil avec du code et plusieurs requètes (ca ne ferai que quelques lignes en plus
                          0
                          1. Bonjour,
                            Je pense aussi que ça peut se faire en une seule requête avec des jointures mais bon malgrés tous les essais que j'ai pu faire j'ai jamais obtenu ce que je souhaitais et toujours pas avec celle que tu viens de me donner !!

                            Merci encore
                            Si vous avez d'autres idées hésitez pas !!
                            Merci
                            0
                            1. Bonjour,

                              il doit y avoir moyen de trouver ce que tu cherches avec une jointure :
                              SELECT 
                              (DISTINCT t1.d1),
                              (DISTINCT t1.d2),
                              t1.d3, 
                              t1.d4, 
                              t1.d5,
                              t2.d1 , 
                              t2.d2, 
                              t2.d3
                              FROM t1
                              LEFT JOIN t2 ON t1.d5 = t2.d1 AND t2.d2
                              WHERE t2.d2 = "toto" AND t2.d3 ="tutu"
                              

                              0
                              1. donc tu peu faire plusieurs requètes et mettre le résultat de ces requètes dans ton fichier texte, cependant vu que les info ne sont pas forcément les mêmes il vaut mieux que la personne qui recevra le fichier sache comment traiter les infos et a quoi correspond chaque colonne
                                0
                                1. tu utilise du php pour créer ton fichier texte a envoyer non ?
                                  0
                                  • 1
                                  • 2