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 :

Sql et les listes IN


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Webmaster
    Inscrit en
    Novembre 2006
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Novembre 2006
    Messages : 158
    Points : 57
    Points
    57
    Par défaut Sql et les listes IN
    Bonjour,
    me revoilà une question SQL mais je chercher et j'ai l'impression de chercher compliquer...

    Alors j'ai une personne qui peut faire 3 sports

    donc sport1, sport2, sport3 (pas de clef étrangere)

    J'ai une table SPORT qui contient une liste de sport voulu.

    Je voudrais faire une recherche des personnes qui pratique par exemple du football et de la basket mais ça me pose probleme...

    par exemple prenons un personne :

    X
    sport1 : football
    sport2 : randonnée

    Y
    sport1 : vélo
    sport : basket

    Z
    sport1 : basket
    sport2 : football

    Si dans ma liste de choix donc 3 champs je mets football en premier et basket en 2eme...je vais avoir X et Y mais pas Z...car le basket est en sport1...vous voyez un peu ce que je veux dire.

    J'avais donc pensé de faire une requête du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT num_cli, nom_cli, prenom_cli FROM CLIENT WHERE sport1 IN (35,11,12) AND sport2 IN (35,11,12) AND sport3 IN (35,11,12) ORDER BY nom_cli
    mais on dirait qu'il ne prend en compte que le sport1 et que le 35

    Voilà un peu mon code

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    $sport1 = $_POST['sport1'];
    $sport2 = ",".$_POST['sport2'];
    $sport3 = ",".$_POST['sport3'];
     
    if ($_POST['sport1'] == 'aucun')
       {
         $sport1 = "";
       }
    if ($_POST['sport2'] == 'aucun')
       {
         $sport2 = "";
       }
    if ($_POST['sport3'] == 'aucun')
       {
         $sport3 = "";
       }
     
     
    ## requête pour le sport1
       $req_sport = mysql_query("SELECT * FROM SPORT ORDER BY lib_sport"); 
         if ($_POST['sport1'] <> 'aucun')
           {
    	     while(($result=mysql_fetch_row($req_sport))!=NULL)
    		     {
    	           $sport_result1 = "AND sport1 IN (".$sport1."".$sport2."".$sport3.")";
    			  }
    	   } 
     
     
    ## requête pour le sport2
       $req_sport = mysql_query("SELECT * FROM SPORT ORDER BY lib_sport"); 
         if ($_POST['sport2'] <> 'aucun')
    	   {
    	     while(($result=mysql_fetch_row($req_sport))!=NULL)
    		     {
    	           $sport_result2 = "AND sport2 IN (".$sport1."".$sport2."".$sport3.")";
    			  }
    	   } 	   
     
     
    	   ## requête pour le sport3
       $req_sport = mysql_query("SELECT * FROM SPORT ORDER BY lib_sport"); 
         if ($_POST['sport3'] <> 'aucun')
           {
    	     while(($result=mysql_fetch_row($req_sport))!=NULL)
    		     {
    	           $sport_result3 = "AND sport3 IN (".$sport1."".$sport2."".$sport3.")";
    			  }
    	   }

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    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 102
    Points : 28 387
    Points
    28 387
    Par défaut
    Si ta structure était normalisée, ce serait plus facile...
    Renormalisons donc :
    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    NUM_CLI
    from    
        (    select    NUM_CLI
                ,    SPORT1 as SPORT
        union
            select    NUM_CLI
                ,    SPORT2 as SPORT
        union
            select    NUM_CLI
                ,    SPORT3 as SPORT
        )
    where    SPORT in ('football', 'basket')
    group by    
            NUM_CLI
    having count(*) = 2
    ;

  3. #3
    Membre du Club
    Profil pro
    Webmaster
    Inscrit en
    Novembre 2006
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Novembre 2006
    Messages : 158
    Points : 57
    Points
    57
    Par défaut
    ça me retourne une erreur de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #1064 - Erreur de syntaxe près de 'SELECT NUM_CLI, SPORT1 AS SPORT
    UNION 
    SELECT NUM_CLI, SPORT2 AS' à la ligne 3
    j'ai ma table client avec num_cli, nom_cli....sport1, sport2, sport3 et ma table sport avec num_sport, lib_sport.
    Je n'ai pas fait de clé étrangere juste quelque chose de manuelle avec le sport1 2 3.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    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 102
    Points : 28 387
    Points
    28 387
    Par défaut
    On dirait qu'il manque la clause FROM
    Voilà ce que c'est que d'être trop rapide.
    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
    select    NUM_CLI
    from    
        (    select    NUM_CLI
                ,    SPORT1 as SPORT
            from    CLIENTS
        union
            select    NUM_CLI
                ,    SPORT2 as SPORT
            from    CLIENTS
        union
            select    NUM_CLI
                ,    SPORT3 as SPORT
            from    CLIENTS
        )
    where    SPORT in ('football', 'basket')
    group by    
            NUM_CLI
    having count(*) = 2
    ;
    Mais tu avais surement déjà compris l'origine de l'erreur

  5. #5
    Membre du Club
    Profil pro
    Webmaster
    Inscrit en
    Novembre 2006
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Novembre 2006
    Messages : 158
    Points : 57
    Points
    57
    Par défaut
    j'ai toujours une erreur du même type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #1064 - Erreur de syntaxe près de 'SELECT num_cli, SPORT1 AS SPORT
    FROM  CLIENT 
    UNION 
    SELECT num_' à la ligne 3
    par contre je ne comprends pas trop à à quoi sert le count à la fin

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    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 102
    Points : 28 387
    Points
    28 387
    Par défaut
    Serait-ce AS que n'aime pas ton SGBD (que tu n'as pas précisé) ?
    ou UNION ?

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    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 102
    Points : 28 387
    Points
    28 387
    Par défaut
    Citation Envoyé par jiojioforever
    par contre je ne comprends pas trop à à quoi sert le count à la fin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE    SPORT IN ('football', 'basket')
    ...sélectionne les clients qui pratiquent un des deux sports ou les deux (basket ou football)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    GROUP BY    
            NUM_CLI
    HAVING count(*) = 2
    ...compte le nombre de sports pratiqués et ne conserve que les clients qui en pratiquent 2 (basket et football)

  8. #8
    Membre du Club
    Profil pro
    Webmaster
    Inscrit en
    Novembre 2006
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Novembre 2006
    Messages : 158
    Points : 57
    Points
    57
    Par défaut
    Je suis sous Mysql 4.0.15 pour les AS et UNION ça devrait fonctionner non ?

    Le compte me sert à rien donc pour mon cas vu que je veux les personnes qui pratiquent soit le foot OU le basket ?

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    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 102
    Points : 28 387
    Points
    28 387
    Par défaut
    Citation Envoyé par jiojioforever
    Le compte me sert à rien donc pour mon cas vu que je veux les personnes qui pratiquent soit le foot OU le basket ?
    Ton besoin a changé ?
    Citation Envoyé par jiojioforever (dans son premier message)
    Je voudrais faire une recherche des personnes qui pratique par exemple du football et de la basket mais ça me pose probleme...

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par jiojioforever
    Je suis sous Mysql 4.0.15 pour les AS et UNION ça devrait fonctionner non ?
    Avant la version 4.1, MySQL ne supporte pas les sous-requêtes, encore moins celles qui figurent dans la clause FROM de la requête principale.
    D'ailleurs, je ne sais même pas si cette construction est supportée dans les versions plus récentes !

Discussions similaires

  1. [SQL Server]La liste de toutes les tables
    Par Husqvarna dans le forum Langage SQL
    Réponses: 6
    Dernier message: 29/09/2008, 16h21
  2. [SQL 2000]Where in qui ne comprend pas les listes
    Par zooffy dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 02/05/2007, 16h36
  3. [SQL] recupere les valeurs d'un liste puis faire une requete SQL
    Par 18Marie dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 22/06/2006, 12h50
  4. Réponses: 3
    Dernier message: 28/11/2003, 21h26
  5. [ODBC] erreur SQL pour les unions qui renvoient vide
    Par fabriceMerc dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 25/11/2003, 11h06

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