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 :

Formulation d'une requête pour bdd mysql


Sujet :

Langage SQL

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 364
    Points : 253
    Points
    253
    Par défaut Formulation d'une requête pour bdd mysql
    Bonjour,

    Voila j'ai un petit soucis, je n'arrive pas à rédiger ma requête SQL
    En fait j'ai 2 tables et 2 associations.
    Voici un bref schéma


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    --------
                                                 |Section|
                                                  --------
                                              1,1|          |0,n
                                                  |          |
                                               créer      voir(vu)
                                                  |          |
                                              0,n|          |0,n
                                                 ----------
                                                 | membre |
                                                 -----------
    Je souhaiterais donc afficher toutes les sections avec comme information la personne qui a créer la section et la personne qui a vu dernièrement cette section, grâce à l'association voir et sa propriété vu qui est de type date et qui va stocker la date de dernier passage du membre.
    Je pense qu'il faut créer un alias.

    J'ai donc fait ceci mais sans résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Select Section.*, Ma.pseudo, Mb.pseudo
    From Section, Membre Ma, Membre Mb, voir
    Where Section.id_membre = Ma.id_membre
    And Mb.id_membre = voir.id_membre
    And Section.id_Section = voir.id_Section
    Having max(voir.vu);

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 115
    Points : 28 480
    Points
    28 480
    Par défaut
    HAVING attend une expression logique... ce que ne retourne pas MAX(voir.vu)...

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 364
    Points : 253
    Points
    253
    Par défaut
    Comment puis-je donc faire pour retourner le résultat attendu.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 115
    Points : 28 480
    Points
    28 480
    Par défaut
    La ligne la plus récente de voir pour chaque id_section :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT  t1.* 
    FROM    voir AS t1 
    WHERE   EXISTS 
            (   SELECT  1 
                FROM    voir AS t2 
                WHERE   t1.id_section = t2.id_section 
                HAVING  t1.vu = MAX(t2.vu) 
            ) 
    ;
    Je te laisse faire la suite

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 364
    Points : 253
    Points
    253
    Par défaut
    J'ai fait cette 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
    SELECT  t1.section_vu, t1.section_id, section_titre, section_time, Ma.membre_pseudo AS membre_last_post
    		, Ma.membre_id AS membre_id_last_post , Mb.membre_pseudo AS membre_createur 
    		, Mb.membre_id AS membre_id_createur
    		FROM  voir AS t1, section, membre AS Ma, membre AS Mb
    		WHERE Mb.membre_id = section.membre_id
    		AND Ma.membre_id = t1.membre_id
    		AND section.forum_id = ".$forum."
    		AND section.section_genre = 'Annonce'
    		AND   EXISTS 
            (   SELECT  * 
                FROM    voir AS t2 
                WHERE   t1.section_id = t2.section_id
                HAVING  t1.section_vu = MAX(t2.section_vu))
    mais je récupère pas le dernier membre, je récupère tout le temps le créateur.
    Aurais-tu une solution ?

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 364
    Points : 253
    Points
    253
    Par défaut
    J'ai remodifié ma requête mais cette fois-ci, j'obtiens toutes les personnes qui ont vu le forum passé en paramètre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT  t1.section_vu, t1.section_id, section_titre, section_time, Ma.membre_pseudo AS         membre_last_post, Ma.membre_id AS membre_id_last_post 
            , Mb.membre_pseudo AS membre_createur , Mb.membre_id AS membre_id_createur
    FROM  voir AS t1, section, membre AS Ma, membre AS Mb
    WHERE Mb.membre_id = section.membre_id
    AND Ma.membre_id = t1.membre_id
    AND section.forum_id = 1
    AND section.section_genre = 'Annonce'
    AND EXISTS 
        ( SELECT  * 
          FROM    voir AS t2 
          WHERE   t1.membre_id = t2.membre_id
          HAVING  t1.section_vu = MAX(t2.section_vu)
        )
    De plus, je voudrais rajouter le nombre de fois que la section a été vu, j'avais rajouté pour cela un count(t1.section_vu) avec un group by sur section.section_id. Mais cela ne m'affiche plus rien.

    Auriez-vous une idée ?

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 364
    Points : 253
    Points
    253
    Par défaut
    J'avance à petit pas mais j'avance

    J'ai cette requête maintenant

    Code :
    SELECT t1.section_vu, t1.section_id, section_titre, section_time, Ma.membre_pseudo AS membre_last_post, Ma.membre_id AS membre_id_last_post
    , Mb.membre_pseudo AS membre_createur , Mb.membre_id AS membre_id_createur
    , section_date
    FROM voir AS t1, section, membre AS Ma, membre AS Mb
    WHERE Mb.membre_id = section.membre_id
    AND Ma.membre_id = t1.membre_id
    AND section.forum_id = ".$forum."
    AND section.section_genre = 'Annonce'
    AND section.section_id = t1.section_id
    AND EXISTS (
    SELECT *
    FROM voir AS t2
    HAVING t1.section_vu = MAX(t2.section_vu)
    ORDER BY t1.section_vu
    )


    Elle me retourne bien le nom du dernier membre ayant posté. Le seul soucis c'est que je n'ai plus qu'une seule section qui s'affiche.
    Alors que je voulais afficher toutes les sections avec le nom de la personne qui l'a modifié dernièrement

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 364
    Points : 253
    Points
    253
    Par défaut
    yipikaï !!!!!!!

    J'ai trouvé

    Voila la requête au cas où cela interesserait quelqu'un

    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
    SELECT t1.section_vu, t1.section_id, section_titre, section_time, Ma.membre_pseudo AS        membre_last_post, Ma.membre_id AS membre_id_last_post 
           , Mb.membre_pseudo AS membre_createur , Mb.membre_id AS membre_id_createur
           , section_date
    FROM  voir AS t1, section, membre AS Ma, membre AS Mb
    WHERE Mb.membre_id = section.membre_id
    AND Ma.membre_id = t1.membre_id
    AND section.forum_id = ".$forum."
    AND section.section_genre = 'Annonce'
    AND section.section_id = t1.section_id
    GROUP BY t1.section_id
    AND EXISTS (   
        SELECT  *
        FROM voir AS t2 
        HAVING  t1.section_vu = MAX(t2.section_vu)
        ORDER BY t1.section_vu
    )

    Je ne pensais pas que l'on pouvait mettre un group by et mettre un and après.
    Mais sa marche donc c'est nickel

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Conseils pour la formulation d'une requête SQL
    Par Saluzatous dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2015, 18h16
  2. Formulation d'une requête mysql avec max & group by
    Par Didier100 dans le forum Requêtes
    Réponses: 4
    Dernier message: 23/09/2010, 17h37
  3. Réponses: 2
    Dernier message: 26/09/2008, 23h32
  4. modifier une requête pour mysql 4.0.18
    Par lina01 dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/11/2006, 12h38
  5. EDBEngineError sur une requête pour MySQL
    Par Slyteck dans le forum Bases de données
    Réponses: 4
    Dernier message: 10/08/2006, 15h17

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