[RESOLU] Query, SELECT sur deux tables...

Eléphanteau du PHP | 12 Messages

13 oct. 2015, 07:04

Bonjourr à tous,

Je me heurte à un soucis depuis ce WE...

J'aimerai récupérer les données stockées dans deux tables différentes et les ranger par date décroissantes. J'ai un soucis notamment dans la rédaction du query.

Ces deux tables ont en point commun uniquement une colonne en l'occurence l'ID de la catégorie.

D'habitude j'utilise ce code pour récupérer les informations d'une table et les afficher :
$sql2 = $bdd->query("SELECT * FROM table1 WHERE category_id='".$cid."' ORDER BY table1_reply_date DESC");
 
    if ($sql2->rowcount() > 0)
    {
        while ($row = $sql2->fetch(PDO::FETCH_ASSOC))
        {
            $tid = $row['id'];
            $cid= $row['category_id'];
 
            $views = $row['table1_views'];
            $date = $row['table1_date'];
 
            $topics .=
            "
                ".$views."
                ".$date."
            ";
        }
        echo $topics;
    }
    else
    {
        echo "<a href='index.php'>Retour à l'index</a>";
        echo "<p>Aucune donnée dans cette catégorie</p>";          
    }
Donc en gros ce que j'aimerai c'est un truc de ce genre :
$sql2 = $bdd->query("SELECT * FROM [b][i][u]table1, table 2[/u][/i][/b] WHERE category_id='".$cid."' ORDER BY [b][u]table1_reply_date, table1_reply_date[/u][/i][/b] DESC");
 
    if ($sql2->rowcount() > 0)
    {
        while ($row = $sql2->fetch(PDO::FETCH_ASSOC))
        {
            $tid = $row['id'];
            $cid= $row['category_id'];
 
            $views1 = $row['table1_views'];
            $date1 = $row['table1_date'];

            $views2 = $row['table2_views'];
            $date2 = $row['table2_date'];
 
            $topics .=
            "
                ".$views1." OR  ".$views2."
                ".$date1." OR   ".$date2."
            ";
        }
        echo $topics;
    }
    else
    {
        echo "<a href='index.php'>Retour à l'index</a>";
        echo "<p>Aucune donnée dans cette catégorie</p>";          
    }
Si vous voulez ce sont des billets un du type citation et un du type avis, qui seront afficher sur une même page car ils appartiennent à une même catégorie.

Merci d'avance aux personnes qui m'aideront,

AlexCode

ViPHP
ViPHP | 2577 Messages

13 oct. 2015, 09:11

Bonjour,

Pour faire un select sur 2 tables, il faut indiquer comment on lie les 2 tables :

Code : Tout sélectionner

select * from table1, table2 where table1.nomColonneX = table2.nomColonneY
Ensuite, tu appliques les conditions que tu souhaites :

Code : Tout sélectionner

select * from table1, table2 where table1.category_id = table2category_id and table1.category_id = 123

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 oct. 2015, 09:33

En complément de la réponse de Mazarini, pour ma part je préfère la syntaxe avec les joins explicites. Non seulement elle est compatible avec d'avantage de bases de données, mais elle permet également de dissocier les critères de rapprochement des tables des critères de filtres de la requête.
SELECT ... 
  FROM table1 t1
    INNER JOIN table2 t2 ON t1.category_id = t2.category_id 
    INNER JOIN ...
  WHERE t1.category_id = 123
    AND ...

On peut également plus facilement basculer d'une jointure interne à une jointure externe :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 12 Messages

13 oct. 2015, 12:35

Merci à tous les deux ! Sincèrement !

Je vais fonctionné par étape et j'en suis désolé !

J'ai donc opéré comme vous m'avez expliqué et j'ai donc ce code :
$sql2 = $bdd->query("SELECT * FROM avis INNER JOIN citation ON avis.category_id = citation.category_id WHERE table_1.cat_id = '".$cid."' ORDER BY avis_reply_date, citation_reply_date DESC");

 
    if ($sql2->rowcount() > 0)
    {
        while ($row = $sql2->fetch(PDO::FETCH_ASSOC))
        {
            $tid = $row['id'];
            $cid= $row['category_id'];
 
            $views = $row['table1_views'];
            $date = $row['table1_date'];
 
            $topics .=
            "
                ".$views."
                ".$date."
            ";
        }
        echo $topics;
    }
    else
    {
        echo "<a href='index.php'>Retour à l'index</a>";
        echo "<p>Aucune donnée dans cette catégorie</p>";          
    }
J'ai juste modifié la première ligne pour le moment ! Malheureusement je me retrouve devant un erreur de RowCount, apparemment on en fait pas sur le query, du coup je bute sur la syntaxe...

Le but du RowCount était de voir si ma requête à zéro résultat alors...

Je suis désolé...

Merci en tout cas,

AlexCode

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

13 oct. 2015, 15:35

Je penche pour une erreur dans ta requête SQL, à vue de nez, ici :
WHERE table_1.cat_id = '".$cid."' 
________^ ______^
Cela devrait mieux fonctionner avec avis.category_id :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 12 Messages

13 oct. 2015, 17:33

Mon Dieu la bêtise ! #-o

Effectivement j'ai plus d'erreur sur le rowcount... Merci @Ryle ! :D

Alors du coup maintenant comment je peux m'arranger dans le echo via $topics pour que la valeur de $views et $date vont chercher dans les deux tables et affichent en fonction du ORDER déterminé ?

Car là en faite, il me sort les résultats que ma table avis et en plus en double exemplaire...

Encore merci,

AlexCode

Eléphanteau du PHP | 12 Messages

13 oct. 2015, 17:49

Et avec un UNION entre les deux tables ça serait plus simple et plus propre non ?

Eléphanteau du PHP | 12 Messages

13 oct. 2015, 21:50

Tout est résolu, j'ai réussi via un UNION des deux tables c'était vachement plus simple !

Merci à tous, j'ai beaucoup appris grâce à vous !

AlexCode