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


nickargall
WRInaute accro
WRInaute accro
 
Messages: 6468
Inscription: 13 Juin 2005

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

Message le Ven Nov 23, 2007 17:55

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

J'ai une requête:
Code: Tout sélectionner
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.


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3835
Inscription: 14 Sep 2006

Message le Ven Nov 23, 2007 18:25

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


nickargall
WRInaute accro
WRInaute accro
 
Messages: 6468
Inscription: 13 Juin 2005

Message le Ven Nov 23, 2007 18:33

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


YoyoS
WRInaute accro
WRInaute accro
 
Messages: 3835
Inscription: 14 Sep 2006

Message le Ven Nov 23, 2007 18:53

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 ^^
Dernière édition par YoyoS le Ven Nov 23, 2007 19:09, édité 1 fois.

jcaron
WRInaute accro
WRInaute accro
 
Messages: 2685
Inscription: 13 Fév 2004

Re: Pb d'organisation d'une UNION de deux requetes SELECT en

Message le Ven Nov 23, 2007 19:06

Je te propose (pour remplacer la première partie):
Code: Tout sélectionner
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.


nickargall
WRInaute accro
WRInaute accro
 
Messages: 6468
Inscription: 13 Juin 2005

Message le Ven Nov 23, 2007 23:36

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: Tout sélectionner
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

jcaron
WRInaute accro
WRInaute accro
 
Messages: 2685
Inscription: 13 Fév 2004

Message le Ven Nov 23, 2007 23:59

nickargall a écrit:
Code: Tout sélectionner
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.


nickargall
WRInaute accro
WRInaute accro
 
Messages: 6468
Inscription: 13 Juin 2005

Message le Sam Nov 24, 2007 0:10

C'est sur, si je fais pas comme on me dit, ça risque pas de marcher :)
Merci Jacques, c'est impeccable.


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité