php
  • sql
  • mysql
  • 2009-12-20 4 views 1 likes 
    1

    J'écris beaucoup de requêtes ressemblant au code de l'exemple de requête ci-dessous. Je me demandais s'il y avait un code/script plus efficace?MySQL - Une requête basée sur une autre requête

    $query1 ="SELECT * FROM table1 WHERE date >= '$todaysdate' "; 
    $result1 = mysql_query($query1) 
        or die ("Error in query: $query1. " . mysql_error()); 
    if (mysql_num_rows($result1) > 0) { 
        while($row1 = mysql_fetch_object($result1)) { 
    
         echo "$row1-date"; 
    
         $query2 ="SELECT * FROM table2 WHERE table1ID >= '$row1-table1ID' "; 
         $result2 = mysql_query($query2) 
          or die ("Error in query: $query2. " . mysql_error()); 
         if (mysql_num_rows($result2) > 0) { 
          while($row2 = mysql_fetch_object($result2)) { 
           echo "$row->datatable2"; 
          } 
         } 
        } 
    } 
    
    +4

    J'espère que vos tables ne sont pas réellement appelées table1 et table2; J'espère que vous comprenez comment éviter l'injection SQL (utilisez la recherche sur StackOverflow sinon) – MarkR

    Répondre

    9

    Essayez d'utiliser SQL JOINs, comme l'exemple suivant:

    SELECT 
        * 
    FROM 
        table1 
    INNER JOIN 
        table2 ON (table2.table1ID = table1.ID) 
    WHERE 
        table1.date >= '2009-12-20'; 
    
    +2

    D'accord, SQL est bien plus que "SELECT * FROM WHERE ", je conseillerais de travailler à travers un tutoriel sur MySQL spécifiquement (par opposition à un extrait de MySQL de tutoriel PHP) – MatBailie

    -1


    Vous pouvez utiliser PDO.
    Vos questions devraient ressembler à ceci ..

    $sth = $dbh->prepare("SELECT name, colour FROM fruit"); 
    $sth->execute(); 
    
    $result = $sth->fetchAll(PDO::FETCH_COLUMN); 
    // OR 
    $result = $sth->fetchAll(PDO::FETCH_OBJ); 
    var_dump($result); 
    

    AOP MANUEL: http://php.net/manual/en/book.pdo.php

    +0

    Ne répond pas à la question. C'est un bon indice, mais pas vraiment ce qu'il veut dans ce cas ... – Franz

    1

    Je ne sais pas sur la structure de vos tables, mais j'ai modifié votre code afin qu'il utilise une jointure:

    $query = 'SELECT table1.date, table2.datatable2 FROM table1, table2 WHERE table1.date >= \''.$todaysdate.'\' AND table2.table1ID >= table1.table1ID'; 
    $result = mysql_query($query) 
        or exit('Error in query: '.$query.' '.mysql_error()); 
    
    if (mysql_num_rows($result) > 0) 
    { 
        while($row = mysql_fetch_object($result)) 
        { 
         echo $row->date; 
         echo $row->datatable2; 
        } 
    } 
    

    dans ce cas, vous sélectionnez plusieurs tables avec séparés par des virgules dE, mais vous pouvez également utiliser INNER/extérieur/GAUCHE/RIGHT JOIN (voir le lien dans la première réponse).

    Questions connexes