Pb d'organisation d'une UNION de deux requetes SELECT en sql

WRInaute accro
Bonsoir
Je vais essayer d'être clair ...

J'ai une requête:
Code:
SELECT DISTINCT(`id_rep`),`message`,`id_forum`,`id_message`,`sujet`,`date`,`heure`,`nom` FROM `messages` WHERE `id_rep`<>0 GROUP BY `id_rep` DESC 

UNION 

SELECT `id_rep`,`message`,`id_forum`,`id_message`,`sujet`,`date`,`heure`,`nom` FROM `messages` WHERE `id_rep`=0

ORDER BY `date` DESC, `heure` DESC
La seconde partie me donne ce que je veux. Par contre, pour le premier bloc, j'ai besoin de garder le select distinct et le group by pour n'avoir qu'un enregistrement ayant le même id_rep.
Mais j'ai également besoin que cet enregistrement unique soit le dernier inscrit dans ma base - cad faire un tri sur `date` DESC et `heure`DESC en même temps que le GROUP BY dans la premiere requete- mais c'est pas possible.
SI quelqu'un me trouve la formule magique, je louerai son nom jusqu'en 2008.
 
WRInaute accro
Hi,

J'ai pas trop compris tes explications même si tu as voulu être clair :D Par contre, c'est peut-être la façon dont tu as commencé ta requête que je comprends pas trop. Puis le group by, je ne l'ai jamais vu en plein milieu d'un union comme ça !

Tu veux sélectionner quoi exactement ? Tu veux que ta requête te sorte un seul enregistrement ? Et si on pouvait avoir un extrait de la table message ! :D
 
WRInaute accro
Je le savais que j'étais pas clair ...

J'ai une table message
id_message | id_forum |sujet|message|nom|date|heure|id_rep|div

Deux cas de figure:
Des messages avec un id_rep=0 (qui sont des sujets de discussion)
Des messages avec un id_rep=variable (qui sont des réponses aux discussion dont l'id_message=$variable)

Ce que je veux :
Regrouper dans un même résultat :
tous les messages ayant un id_rep=0
et tous les messages ayant un id_rep=$variable DISTINCT

et trier le tout sur date et heure.. avec parfois des restrictions du genre div=1, id_forum=12, ou encore nom='durand' par exemple

Ma requete en haut marche presque, sauf que par exemple pour l'enregistrement correspondant à un id_rep=215, par exemple, il me sort pas forcément le dernier enregistrement. C'est ce que je veux avoir ... :?

Edit : Le group by, si je le mets pas, c'est comme si le distinct marchait pas, il va me sortir tous les messages ayant le même id_rep
 
WRInaute accro
Donc tu veux sélectionner des discussions existantes dans ta bdd ? Et pour chaque discussion afficher son dernier message en gros ? :D

Donc dans ta table message, tu as plein de id_rep identiques qui correspondent aux messages de la discussion id_message.

Et tu veux sélectionner: Toutes les discussions id_message = x et ses messages id_rep = x

Tu a déjà fait ça en requêtes séparées déjà ? C'est un peu bizarre quand même ton système ^^
 
WRInaute accro
Re: Pb d'organisation d'une UNION de deux requetes SELECT en

Je te propose (pour remplacer la première partie):
Code:
SELECT id_rep,message,id_forum,id_message,sujet,date,heure,nom FROM messages WHERE id_message IN (SELECT max(id_message) FROM messages WHERE id_rep<>0 GROUP BY id_rep)

Evidemment il faut une BDD qui gère les sub-selects... Et ça considère que les id_messages sont alloués de façon croissante. C'était bien le dernier message chaque discussion que tu voulais?

Jacques.
 
WRInaute accro
Bonsoir Jacques

En effet c'est bien le dernier message de chaque discussion que je voulais. Et en effet, les id_message sont alloués de façon croissante.

Mais là les résultats qui me sont renvoyés sont
- uniquement le dernier "message" enregistré sur la base (dont l' id_rep=2213) et non le dernier message de chaque discussion

- suivi de tous les "débuts de discussion" dont l' id_rep=0.


Code:
SELECT id_rep,message,id_forum,id_message,sujet,date,heure,nom FROM messages WHERE id_message IN (SELECT max(id_message) FROM messages WHERE id_rep<>0 ) AND `div`='1' GROUP BY `id_rep` UNION SELECT `id_rep`,`message`,`id_forum`,`id_message`,`sujet`,`date`,`heure`,`nom` FROM `messages` WHERE  `div`='1' AND `id_rep`=0
 
WRInaute accro
nickargall a dit:
Code:
SELECT id_rep,message,id_forum,id_message,sujet,date,heure,nom FROM messages WHERE id_message IN (SELECT max(id_message) FROM messages WHERE id_rep<>0 ) AND `div`='1' GROUP BY `id_rep` UNION SELECT `id_rep`,`message`,`id_forum`,`id_message`,`sujet`,`date`,`heure`,`nom` FROM `messages` WHERE  `div`='1' AND `id_rep`=0

Tu n'as pas mis les parenthèses au bon endroit, vérifie ce que je disais dans mon message. Le GROUP BY est dans le sub-select...

Jacques.
 
Discussions similaires
Haut