Commmint Posté 13 Septembre 2006 Posté 13 Septembre 2006 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 voilà j'espère que j'ai été assez clair, merci d'avance pour vos réponses !
Vikchill Posté 14 Septembre 2006 Posté 14 Septembre 2006 (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, dateFROM tableWHERE 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, dateFROM tableWHERE 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é 14 Septembre 2006 par Vikchill
Commmint Posté 14 Septembre 2006 Auteur Posté 14 Septembre 2006 Je regarde ça dans l'aprem. Merci beaucoup, même si à priori j'ai du mal à comprendre l'imbrication des SELECT et UNION.
Vikchill Posté 14 Septembre 2006 Posté 14 Septembre 2006 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
Commmint Posté 15 Septembre 2006 Auteur Posté 15 Septembre 2006 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 :/
Vikchill Posté 15 Septembre 2006 Posté 15 Septembre 2006 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 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 topicFROM table - posts sans réponse: SELECT idFROM tableWHERE id NOT in (SELECT DISTINCT topic FROM table) - dernière réponse de chaque post: SELECT topic, MAX(id)FROM tableWHERE id in (SELECT DISTINCT topic FROM table)GROUP BY topic
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant