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

Requêtes MySQL Discussion :

Sélection d' une valeur max depuis 2 tables


Sujet :

Requêtes MySQL

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 53
    Points : 39
    Points
    39
    Par défaut [RESOLU] Sélection d' une valeur max depuis 2 tables
    Bonjour

    @ tous

    J'ai une information a extraire d'une base qui à la structure suivante:
    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
     
    user 
    ________________________
    | id |login | password | mail |
     
    group
    ___________
    | id | descr  |
     
    usergroup (Appartenance d'un user à un groupe)
    __________________
    | id | iduser| idgroup |
     
    droit
    ___________________________
    | id | droit | id_user | id_group |
    Je veux etraire la valeur maximale de droit de la table droit où l'id_user = un id précis ou alors où l'id_group correspond à un id_user dan sla table user group.

    Voila les deux sous requetes, je n'arrive pas à joindre (fusionner) les deux résultats pour en extraire ensuite la plus grande valeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // extraction du droit de l'utilistateur d'id $id
     
    SELECT droit AS DROIT2 FROM droits WHERE 	
      (id_user=$id AND id_module=
        (SELECT id FROM module WHERE url='calendrier.php')
    )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT droit AS DROIT3 FROM droits WHERE 
    (id_group=(select id FROM usergroup WHERE iduser=$id))
    AND
    ( id_module=(SELECT id FROM module WHERE url='calendrier.php'))
    Donc ce que je veux faire:
    ecrire une grande requète qui sélectionne le max de droit parmi DROIT2 (1 valeur au plus) et DROIT3 (plus d'une valeur)

    J'ai tenté une union entre DROIT2 et DROIT3 qui ne fonctionne pas car COUNT(DROIT2) est différent de COUNT(DROIT3)

    Merci d'avance

  2. #2
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Si tu fait une union des deux tables, il me semble qu'il faudrait que tu donne le meme nom de colonne au nom de tes champs. en enlevant les alias par exemple. Je crois que ça marcherait.

    Sinon il doit aussi y avoir une solution qui doit ressembler à ça(ou presque ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT MAX(droit)  
      FROM droits 
      WHERE  (id_user=@id OR
                   id_group=(select id FROM usergroup WHERE iduser=@id))
                  AND  
                  ( id_module=
                    (SELECT id FROM module WHERE url='calendrier.php'))
    Pensez au tag

  3. #3
    Débutant
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 53
    Points : 39
    Points
    39
    Par défaut
    Effectivmeent ca marche très bien si je n'ai qu'un seul userid = valeur en question dan sla table droit !

    J'ai crée un droit de 2 pour l'user 1 et un de 3 pour le groupe 2 (dont fait parti l'user 1) et la j'ai ce message d'erreur :
    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
    21
    22
    23
    requête SQL: 
     
    SELECT MAX( droit ) 
    FROM droits
    WHERE (
     
    id_user =1
    OR id_group = ( 
    SELECT id
    FROM usergroup
    WHERE iduser =1 ) 
    )
    AND (
    id_module = (
     
    SELECT id
    FROM module
    WHERE url = 'calendrier.php'
    )
    ) 
    MySQL a répondu: 
     
    #1242 - Subquery returns more than 1 row
    Le problème vien du fait qu'un use rpeu fair eparti de plusieurs groupe d'ou le
    SELECT id
    FROM usergroup
    WHERE iduser =1
    renvoi plusieurs lignes !

    Merci d'avance

  4. #4
    Débutant
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 53
    Points : 39
    Points
    39
    Par défaut
    J'ai trouvé et je poste la réponse si ca peu aider qq'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
    17
    18
    19
    requête SQL: 
    SELECT MAX( droit ) 
    FROM droits
    WHERE (
    id_user =1
    OR id_group
    IN (
     
    SELECT idgroup
    FROM usergroup
    WHERE iduser =1
    )
    )
    AND (
    id_module = ( 
    SELECT id
    FROM module
    WHERE url = 'calendrier.php' ) 
    )
    Meric pour votre aide

  5. #5
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut
    Alors dans ce cas, la solution est de remplacer les '=' par des IN... (je sais pas pourquoi je l'ai pas fait. Je le fais tout le temps d'habitude )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT MAX(droit)  
      FROM droits 
      WHERE  (id_user=@id OR
                   id_group IN (select id FROM usergroup WHERE iduser=@id))
                  AND  
                  ( id_module IN
                    (SELECT id FROM module WHERE url='calendrier.php'))
    ça devrait marcher
    Pensez au tag

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/08/2013, 19h19
  2. [AC-2007] Sélection d'un champ date "non null" et d'une valeur "MAX"
    Par saintsat dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 15/04/2013, 10h42
  3. Réponses: 3
    Dernier message: 22/03/2012, 15h16
  4. ajouter une valeur max depuis une BDD
    Par ygeeg dans le forum Windows Forms
    Réponses: 8
    Dernier message: 09/03/2010, 22h31
  5. insérer une valeur 'max + 1' dans une table
    Par pierre.egaud dans le forum Access
    Réponses: 2
    Dernier message: 13/04/2006, 15h00

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