[RESOLU] Afficher les résultats (en intercalé) de deux tables MySQL

Avatar du membre
Mammouth du PHP | 1564 Messages

09 févr. 2015, 17:01

Bonjour,

je bloque là, je viens de cherche de l'aide car je n'y arrive pas, voila, j'ai créé un forum en PHP et maintenant, je souhaiterais afficher les derniers messages (post d'ajout de sujet et post d'ajout de message)

J'ai deux tables: forum_posts (pour l'ajout de sujet)
Et forum_messages (pour l'ajout de message, à partir de l'ID du sujet)

J'aimerai afficher les résultats comme ceci (exemple):
etc...
le 11-01-2015 à 9H48, le membre "Nom du membre" ajoute le sujet "Nom du sujet"
le 10-01-2015 à 15H30, le membre "Nom du membre" ajoute une réponse au sujet "Nom du sujet"
le 10-01-2015 à 14H17, le membre "Nom du membre" ajoute le sujet "Nom du sujet"
les champs de ma tables forum_posts sont les suivants:
|------
|Colonne|Type|Null|Défaut
|------
|//**id**//|int(11)|Non|
|pseudo|varchar(25)|Non|
|id_membre|int(11)|Non|
|titre|varchar(50)|Non|
|titre_rewrite|varchar(50)|Non|
|post|text|Non|
|date_ajout|bigint(20)|Non|
|id_forum|int(11)|Non|


Les champs de la table forum_messages:
|------
|Colonne|Type|Null|Défaut
|------
|//**id**//|int(11)|Non|
|pseudo|varchar(25)|Non|
|id_membre|int(11)|Non|
|message|text|Non|
|id_post|int(11)|Non|
|date_ajout|bigint(20)|Non|

Merci pour votre éventuelle aide

Mammouth du PHP | 688 Messages

09 févr. 2015, 17:35

tu fais 2 requetes sql, et tu tries les résultats en php selon la date et heure.

Avatar du membre
Mammouth du PHP | 1564 Messages

09 févr. 2015, 18:08

en intercalant les résultats ? comment ?

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

13 févr. 2015, 16:03

Hello !

Regarde du côté de la commande UNION. Elle te permet de concatener les résultats de plusieurs requêtes SQL dans un seul traitement.
select *
from (
    select ... from forum_posts where ... -- récupère les sujets
    union all
    select ... from forum_messages join forum_posts on ... where ... -- récupère les messages avec jointure sur les sujets pour récupérer le titre
) a
order by date_ajout desc
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Avatar du membre
Mammouth du PHP | 1564 Messages

13 févr. 2015, 17:42

Merci, je ne connait pas, je vais essayer :wink:

Avatar du membre
Mammouth du PHP | 1564 Messages

15 févr. 2015, 15:50

Bon, je n'y arrive, je n'arrive pas avec FROM, je ne vois pas quoi mettre comme condition car j'ai pas de condition à donner en fait.

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

16 févr. 2015, 01:13

J'ai juste donnée une structure de requête SQL. Si tu n'as pas de condition WHERE, il suffit de ne pas en mettre ;)
SELECT *
FROM (
    SELECT p.date_ajout, ... FROM forum_posts p -- récupère les sujets
    UNION ALL
    SELECT m.date_ajout, ... FROM forum_messages m JOIN forum_posts p ON ... -- récupère les messages avec jointure sur les sujets pour récupérer le titre
) a
ORDER BY date_ajout DESC
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Avatar du membre
Mammouth du PHP | 1564 Messages

16 févr. 2015, 01:17

Ok, merci pour l'info.

Le "a" à quelque chose à voir dans la requête (au dessus de ORDER BY) ?

Avatar du membre
Mammouth du PHP | 1564 Messages

16 févr. 2015, 01:32

Je n'y arrive toujours pas, c'est complexe ce truc, ça me retourne aucun résultat:
SELECT *
FROM (
    SELECT p.id,p.id_forum,p.titre_rewrite,p.titre,p.date_ajout FROM forum_posts p
    UNION ALL
    SELECT m.id_post,m.date_ajout FROM forum_messages m JOIN forum_posts p ON m.id_post = p.id
) a
ORDER BY date_ajout DESC
Fait moi une requête que j’étudierais par la suite, s'il te plaît

Mammouth du PHP | 688 Messages

16 févr. 2015, 02:00

la, c'est une faute de frappe.
les 2 sous-requetes doivent retourner le même nombre de champs, et le même type de champs.

Avatar du membre
Mammouth du PHP | 1564 Messages

16 févr. 2015, 02:05

Merci pour ta contribution

alors comment faire si je veut le titre de la table forum_post, dans ce cas ?

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

16 févr. 2015, 11:30

Le " a " est un alias donné au résultat de tes requêtes. En fait, le SELECT qui est autour et qui permet de trier tes enregistrement va interroger le résultat de ton UNION comme s'il interrogeait une table de la base de données. Cela permet simplement de donner un nom à cette "table virtuelle" :)

Pour que l'Union fonctionne, il faut que chacune des requêtes retourne le même nombre de colonne et dans le même ordre. Et pour récupérer les infos du topic dans ton message, c'est l'objet la jointure :)
SELECT *
FROM (
    SELECT 'topic' as type_message, p.id, p.id_forum, p.titre_rewrite,p.titre,p.date_ajout FROM forum_posts p
    UNION ALL
    SELECT 'answer' as type_message, m.id_post,p.id_forum, p.titre_rewrite,p.titre,m.date_ajout FROM forum_messages m JOIN forum_posts p ON m.id_post = p.id
) a
ORDER BY date_ajout DESC
J'ai également ajouté une constante (type_message) dans chaque requête qui te permettra de savoir si tu parcours un enregistrement de type sujet ou de type reponse pour pouvoir ajuster ton message à l'affichage :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Avatar du membre
Mammouth du PHP | 1564 Messages

16 févr. 2015, 14:30

Chouette, merci, est il possible d'utiliser un LIMIT 0,10 avec cette requête ?

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

16 févr. 2015, 18:19

C'est possible, il suffit de l'ajouter tout à la fin :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Avatar du membre
Mammouth du PHP | 1564 Messages

24 févr. 2015, 12:43

Merci beaucoup pour votre aide, ça fonctionne nikel, je comprend pas tout mais c'est mieux que rien :D

Je souhaiterais ajouter l'id du message qui à été ajouté au post, afin que je puisse mettre une ancre, au lien (lien#id du msg), j'ai donc essayé de mettre deux fois m.id dans les deux requêtes mais ça ne fonctionne pas.