Aller au contenu

Tri des topics par dernier message MYSQL


Sujets conseillés

Posté

Bonjour à tous

Après presque un an d'absence du hub, et ses conseils qui changent la vie, j'ai de nouveau besoin de tous les cracks du MYSQL.

J'ai pas mal cherché sans trouver la réponse qui colle exactement à mon problème. ça sera une formalité pour vous.

Dans le cadre du développement d'un mini forum, les topics et les réponses sont enregistrés dans la meme table.

les réponses sont rattachées à leur topic via un champ "topic" qui contient l'ID du topic en question.

Chaque enregistrement dispose d'une date.

donc

ID / topic

1 / NULL >>> topic ID 1

2 / NULL >>> topic ID 2

3 / 1 >>> réponse au topic ID 1

4 / 2 >>> réponse au topic ID 2

5 / NULL >>> topic ID 5

6 / 5 >>> réponse au topic 5

Mon but est de faire comme dans les grand forums dignes de ce nom,

un TRI des topics sans réponse PAR DATE de topic

un TRI des topics avec réponse PAR DATE de DERNIER REPONSE (pour faire des up de certains topics)

évidemment, des topics sans réponse cotoient des topics avec dans la meme liste, le tout parfaitement organisé par date DESC

pour faire propre, je veux le faire en une requète :whistling:

voilà j'espère que j'ai été assez clair, merci d'avance pour vos réponses !

Posté (modifié)

Alors, allons-y par étape, en éspérant que j'ai bien compris ton message.

Ce que tu appelles un topic sans réponse est en fait un "id" qu'on a jamais dans le champs "topic":

SELECT id, date
FROM table
WHERE id NOT IN (SELECT topic
FROM table
)
ORDER BY date DESC

Cette requête devrait répondre à ta première demande.

Pour la deuxième, c'est le contraire, il faut prendre uniquement les "id" qu'ont retrouve dans le champs "topic" en ne prenant que la plus grande date:

SELECT id, date
FROM table
WHERE id IN (SELECT topic
FROM table
)
AND date = (SELECT MAX(date)
FROM table t
WHERE table.id=t.id
)
ORDER BY date DESC

Tu veux l'union des deux, classée par date, donc ça devrait donner:

SELECT *
FROM (SELECT id, date
FROM table
WHERE id NOT IN (SELECT topic
FROM table
)

UNION ALL

SELECT id, date
FROM table
WHERE id IN (SELECT topic
FROM table
)
AND date = (SELECT MAX(date)
FROM table t
WHERE table.id=t.id
)
)
ORDER BY date DESC

N'ayant ni la structure de ta base, ni aucun moyen de tester tout ça, ça reste à prendre avec des pincettes. Tu diras ce que ça donne :)

Modifié par Vikchill
Posté

Je regarde ça dans l'aprem. Merci beaucoup, même si à priori j'ai du mal à comprendre l'imbrication des SELECT et UNION.

Posté

L'union des deux SELECT imbriqués ajoute leurs résultats, pour ça il faut qu'on ait les mêmes colonnes dans les deux requêtes. Les enregistrement retournés ne sont pas triés, d'où l'imbrication qui ne sert qu'à faire le tri, mais j'ai un doute sur sa necessité, mais comme je ne peux pas tester :s

Posté

La grosse requète qui combine TOPIC par date et TOPIC par date de réponse produit une erreur. Merci quand même.

Je me souviens d'un exemple qui répondait à mes besoins dans lequel on ne triait pas par date, mais par ID pour connaitre le dernier d'un topic donné.

Curieusement, cette requète était beaucoup plus légère.

Ne peut on pas plus simplement faire une requete qui trie les TOPIC NULL et NOT NULL (avec et sans réponse combinés) PAR DATE (soit de DATE TOPIC soit de DATE reponse) ?

je patauge :/

Posté
La grosse requète qui combine TOPIC par date et TOPIC par date de réponse produit une erreur. Merci quand même.

Faudrait nous aider un peu aussi :wacko: Quelle erreur? As-tu aussi testé les requêtes individuellement?

Je me souviens d'un exemple qui répondait à mes besoins dans lequel on ne triait pas par date, mais par ID pour connaitre le dernier d'un topic donné.

Curieusement, cette requète était beaucoup plus légère.

Je n'ai toujours pas la structure de ta table, ni comment elle est gérée. Si effectivement ton champs id est incrémental, nul besoin de date puisque les id sont forcément classés dans l'ordre chronologique.

Ne peut on pas plus simplement faire une requete qui trie les TOPIC NULL et NOT NULL (avec et sans réponse combinés) PAR DATE (soit de DATE TOPIC soit de DATE reponse) ?

je patauge :/

On peut à peu près tout faire, mais donner plus d'éléments serait peut-être bien, là on navigue un peu en aveugle :)

En attendant, essaie ces trois requêtes et dis voir si elle fonctionnent si tu veux bien:

- posts avec réponse:

SELECT DISTINCT topic
FROM table

- posts sans réponse:

SELECT id
FROM table
WHERE id NOT in (SELECT DISTINCT topic
FROM table)

- dernière réponse de chaque post:

SELECT topic, MAX(id)
FROM table
WHERE id in (SELECT DISTINCT topic
FROM table)
GROUP BY topic

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...