Page 1 sur 2

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

Posté : 09 févr. 2015, 17:01
par two3d
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

Re: Afficher les résultats (en intercalé) de deux tables MyS

Posté : 09 févr. 2015, 17:35
par tof73
tu fais 2 requetes sql, et tu tries les résultats en php selon la date et heure.

Re: Afficher les résultats (en intercalé) de deux tables MyS

Posté : 09 févr. 2015, 18:08
par two3d
en intercalant les résultats ? comment ?

Re: Afficher les résultats (en intercalé) de deux tables MyS

Posté : 13 févr. 2015, 16:03
par Ryle
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

Re: Afficher les résultats (en intercalé) de deux tables MyS

Posté : 13 févr. 2015, 17:42
par two3d
Merci, je ne connait pas, je vais essayer :wink:

Re: Afficher les résultats (en intercalé) de deux tables MyS

Posté : 15 févr. 2015, 15:50
par two3d
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.

Re: Afficher les résultats (en intercalé) de deux tables MyS

Posté : 16 févr. 2015, 01:13
par Ryle
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

Re: Afficher les résultats (en intercalé) de deux tables MyS

Posté : 16 févr. 2015, 01:17
par two3d
Ok, merci pour l'info.

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

Re: Afficher les résultats (en intercalé) de deux tables MyS

Posté : 16 févr. 2015, 01:32
par two3d
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

Re: Afficher les résultats (en intercalé) de deux tables MyS

Posté : 16 févr. 2015, 02:00
par tof73
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.

Re: Afficher les résultats (en intercalé) de deux tables MyS

Posté : 16 févr. 2015, 02:05
par two3d
Merci pour ta contribution

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

Re: Afficher les résultats (en intercalé) de deux tables MyS

Posté : 16 févr. 2015, 11:30
par Ryle
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 :)

Re: Afficher les résultats (en intercalé) de deux tables MyS

Posté : 16 févr. 2015, 14:30
par two3d
Chouette, merci, est il possible d'utiliser un LIMIT 0,10 avec cette requête ?

Re: Afficher les résultats (en intercalé) de deux tables MyS

Posté : 16 févr. 2015, 18:19
par Ryle
C'est possible, il suffit de l'ajouter tout à la fin :)

Re: [RESOLU] Afficher les résultats (en intercalé) de deux t

Posté : 24 févr. 2015, 12:43
par two3d
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.