IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Combiner deux requêtes


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 141
    Points : 92
    Points
    92
    Par défaut Combiner deux requêtes
    Bonjour,

    je fais appelle à vous car je suis galère depuis 1h sur une requête qui je pense est simple mais bizarrement je bloque dessus.

    J'ai trois tables comme suis (simplifiée):
    sujets
    id
    nom

    messages
    id_sujet
    date
    id_membre
    texte

    membres
    id
    pseudo

    Ce que je cherche à faire est la chose suivante :
    Lister les différents sujets du forum, indiquer le nombre de message pour chaque sujet et indiquer le dernier membre qui a écrit dans ce sujet.

    Pour ce qui est du nom du sujet et du nombre de message pas de soucis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT s.nom, s.id, COUNT(m.id) as nbMessage
    FROM sujets s
    LEFT JOIN messages m ON m.id_sujet=s.id
    GROUP BY s.id
    ORDER BY s.nom ASC
    N'arrivant pas à sortir également le dernier membre inscrits j'ai fais une deuxième requête (je suis dans une boucle PHP)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT m.pseudo
    FROM messages mess
    LEFT JOIN membres m ON m.id=mess.id_membre
    WHERE mess.id=(SELECT MAX(id) FROM messages WHERE sujet='".$id."')
    Le tout fonctionne
    mais comme j'ai plusieurs dizaines de sujets ça me fait pas mal de requête
    J'aimerais donc tout mixer en 1 requête mais seulement je tourne en rond

    Merci de votre aide

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Reprenons le besoin et décomposons :
    Lister les différents sujets du forum, indiquer le nombre de message pour chaque sujet et indiquer le dernier membre qui a écrit dans ce sujet.
    1) On va commencer par la fin :
    indiquer le dernier membre qui a écrit dans ce sujet
    Pour obtenir ceci, il faut connaître la date du dernier message par sujet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT id_sujet, MAX(date) AS date_max
    FROM messages
    GROUP BY id_sujet
    Au passage, 'date' est un mauvais nom de colonne car c'est un mot réservé du langage SQL.

    Ensuite, pour savoir quel membre a écrit ce dernier message, on fait une jointure entre la table et la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT t1.id_sujet, ms.id_membre
    FROM messages ms
    INNER JOIN
    (
    	SELECT id_sujet, MAX(date) AS date_max
    	FROM messages
    	GROUP BY id_sujet
    ) t1
    	ON t1.id_sujet = ms.id_sujet
    	AND t1.date_max = ms.date
    2)
    indiquer le nombre de message pour chaque sujet
    On peut ajouter un simple COUNT à la sous-requête et reprendre son résultat dans la requête principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT t1.id_sujet, t1.nb_messages, ms.id_membre
    FROM messages ms
    INNER JOIN
    (
    	SELECT id_sujet,
    		MAX(date) AS date_max,
    		COUNT(*) AS nb_messages
    	FROM messages
    	GROUP BY id_sujet
    ) t1
    	ON t1.id_sujet = ms.id_sujet
    	AND t1.date_max = ms.date
    3)
    Lister les différents sujets du forum
    Un identifiant n'étant pas très parlant, il suffit de faire une jointure des deux autres tables avec la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    SELECT s.nom AS sujet,
    	COALESCE(t2.nb_messages, 0) AS nb_messages,
    	COALESCE(m.nom, 'Néant') AS dernier_posteur
    FROM sujets s
    LEFT OUTER JOIN
    (
    	SELECT t1.id_sujet, t1.nb_messages, ms.id_membre
    	FROM messages ms
    	INNER JOIN
    	(
    		SELECT id_sujet,
    			MAX(date) AS date_max,
    			COUNT(*) AS nb_messages
    		FROM messages
    		GROUP BY id_sujet
    	) t1
    		ON t1.id_sujet = ms.id_sujet
    		AND t1.date_max = ms.date
    ) t2 ON t2.id_sujet = s.id
    	LEFT OUTER JOIN membres m ON m.id = t2.id_membre
    COALESCE donne la première valeur non nulle parmi ce qui figure dans ses parenthèses. C'est pour le cas où un sujet n'aurait pas de message.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Combiner deux requêtes
    Par abdelghafour89 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/11/2013, 22h06
  2. [VxiR2] combiner deux requêtes
    Par coolmek dans le forum Deski
    Réponses: 1
    Dernier message: 18/04/2012, 15h38
  3. [Vxi3] Combiner dans un rapport les données de deux requêtes
    Par TarsemGau dans le forum Webi
    Réponses: 4
    Dernier message: 01/03/2011, 17h38
  4. Mixer deux requêtes
    Par WriteLN dans le forum Requêtes
    Réponses: 3
    Dernier message: 14/11/2005, 09h34
  5. Afficher le ratio du résultat de deux requêtes
    Par decour dans le forum Access
    Réponses: 25
    Dernier message: 07/11/2005, 19h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo