Pb d'organisation d'une UNION de deux requetes SELECT en sql
8 messages
• Page 1 sur 1
-

nickargall - WRInaute accro

- Messages: 6468
- Inscription: 13 Juin 2005
Pb d'organisation d'une UNION de deux requetes SELECT en sql
Bonsoir
Je vais essayer d'être clair ...
J'ai une requête:
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.
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

- Messages: 3835
- Inscription: 14 Sep 2006
Hi,
J'ai pas trop compris tes explications même si tu as voulu être clair
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 !
J'ai pas trop compris tes explications même si tu as voulu être clair
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 !
-

nickargall - WRInaute accro

- Messages: 6468
- Inscription: 13 Juin 2005
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
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

- Messages: 3835
- Inscription: 14 Sep 2006
Donc tu veux sélectionner des discussions existantes dans ta bdd ? Et pour chaque discussion afficher son dernier message en gros ?
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 ^^
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

- Messages: 2685
- Inscription: 13 Fév 2004
Re: Pb d'organisation d'une UNION de deux requetes SELECT en
Je te propose (pour remplacer la première partie):
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.
- 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

- Messages: 6468
- Inscription: 13 Juin 2005
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.
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

- Messages: 2685
- Inscription: 13 Fév 2004
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

- Messages: 6468
- Inscription: 13 Juin 2005
C'est sur, si je fais pas comme on me dit, ça risque pas de marcher
Merci Jacques, c'est impeccable.
Merci Jacques, c'est impeccable.
8 messages
• Page 1 sur 1
Lectures recommandées sur ce thème :
- Se prémunir des attaques de type union select (...)
- Organisation d'une base de données SQL
- SQL : Casse-tête d'un tri sur une requête employant UNION ALL
- Probleme select SQL
- Optimisation SQL - Inner Join (3) ou 3 x Select ?
- Requete sql INSERT INTO + SELECT (php)
- sql : requête select MAX(champ) from table
- [SQL]Requete select à l'intérieur d'un Delete
- [PHP/SQL] Associer plusieurs SELECT de tables MySQL
- SQL : faire un select indifférent aux caractère spéciaux
- Nombre moyen de mots par requête : statistiques AOL Août 2006 - 10-08-2006
- Yahoo se réorganise pour se concentrer sur 3 activités - 08-12-2006
- ITA Software racheté par Google : à quand la réservation d'avion ? - 02-07-2010
- AdSense Tracking : statistiques détaillées sur les clics AdSense - 29-02-2004
- Résultats des élections régionales 2010 sur Google Maps - 21-03-2010
- Nuage de tags Wordle pour WebRankInfo - 29-04-2009
- Outils Google pour les entreprises : Google Agency Toolkit - 01-03-2009
- De la publicité ciblée dans les cartes de Google Local - 31-03-2006
Consultez la description détaillée des produits ou services de Google suivants : Google Trends Recherche Personnalisée
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité
