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 :

Test d'une condition sur plusieurs lignes


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Test d'une condition sur plusieurs lignes
    Bonjour tout le monde,

    Je suis un brin coincé par un "petit" problème.

    Je vous explique :

    J'ai une base avec de multiples tables liées entre elles (jusqu'ici rien de bien folichon). Pour créer un module de recherche avancée, j'ai créé une requête (view) qui met à plat les données de plusieurs table pour que je puisse rechercher à travers tous les champs.

    Voici un exemple résumé de ce que ça donne avec 2 tables :

    table 1 (private_datas):

    id | firstname | lastname
    1 alain dupont
    2 jessie alarue
    .....

    table 2 (activity)

    id | description | private_data_id
    1 tennis 1
    2 natation 1
    3 pétanque 1
    4 tennis 2
    5 bowling 2

    la table2 est liée à la table1 grâce à private_data_id par une relation 1 à plusieurs.

    Maintenant, quand je mets tout ça à plat j'obtiens :

    id | firstname | lastname | description
    1 alain dupont tennis
    1 alain dupont natation
    1 alain dupont pétanque
    2 jessie alarue tennis
    2 jessie alarue bowling
    ....

    Jusque là, rien de nouveau. Ce qui m'embête plus c'est que j'aimerais écrire une requête me permettant de trouver les personnes qui font à la fois du tennis et de la natation par exemple (dans mon cas, alain dupont mais pas jessie alarue). Un truc du genre :

    SELECT * FROM requete WHERE firstname='un critère' AND lastname='un critère' AND (description='tennis' AND description='natation'); qui évidemment ne fonctionne pas comme demandé...

    Je vous avoue que là je sèche un peu.

    Si qqn pouvait éclairer ma lenterne ce serait fort sympathique.

    Merci.

    Pichto

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 254
    Points : 304
    Points
    304
    Par défaut
    Faut-il passer obligatoirement par la table intermédiaire?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT firstname, lastname
    FROM table1 t1, table2 t2
    WHERE t1.id = t2.private_data_id
    AND description='tennis' AND description='natation';
    Quand un problème a une solution, rien ne sert de s'inquiéter. Quand il n'y a pas de solution, s'inquiéter n'arrange rien.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Ben disons que ça m'arrangerait bien de pouvoir garder la table intermédiaire sachant que le formulaire de recherche est assez compliqué et qu'il touche un nombre assez conséquent de tables. Si je dois utiliser ton idée (qui au demeurant fonctionne très bien) à chaque cas similaire, ça va vite être un joyeux casse-tête de faire écrire la requête dynamiquement par mon code .net...

    Néanmoins si ça n'est pas possible, va falloir que je réétudie la question.

    Merci,

    Pichto

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 254
    Points : 304
    Points
    304
    Par défaut
    Une autre solution nettement moins élégante serait: (A tester)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT firstname, lastname
    FROM requete  r1, requete r2
    WHERE r1.private_data_id = r2.private_data_id
    AND r1.description='tennis' AND r2.description='natation';
    Il faut pour cela qu'il n'y ai pas dans la table 2 de doublon du genre
    1 tennis 1
    2 tennis 1
    3 natation 1
    4 natation 1
    Quand un problème a une solution, rien ne sert de s'inquiéter. Quand il n'y a pas de solution, s'inquiéter n'arrange rien.

  5. #5
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Voilà une solution sous réserve que chaque sport soit unique pour chaque personne (autrement dit que l'on n'ait pas 2 fois natation pour la même personne)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT firstname, lastname, 
    sum(case when description='tennis' then 1 else 0 end) NB_TENNIS,
    sum(case when description='natation' then 1 else 0 end) NB_NATATION
    FROM table1 t1, table2 t2
    WHERE t1.id = t2.private_data_id
    group by firstname, lastname
    HAVING (sum(case when description='tennis' then 1 else 0 end)+
    sum(case when description='natation' then 1 else 0 end))=2
    On peut simplifier le case when du having par sum(case when description in ('tennis','natation') then 1 else 0 end)

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    OK, je crois que finalement je vais suivre la première solution de OUACH.

    Dis-moi si je vais dans la bonne direction.

    Je veux trouver toutes les personnes qui ont un "e" dans leur prénom et qui font à la fois du tennis et de la natation :

    SELECT firstname,lastname
    FROM table1
    WHERE firstname LIKE '%e%'
    INTERSECT
    SELECT DISTINCT firstname, lastname
    FROM table1 t1, table2 t2
    WHERE t1.id = t2.private_data_id
    AND description='tennis' AND description='natation';

    Sous réserve de modifier INTERSECT pour qu'il soit compris par mon SGBDR

    ça te paraît bon?

    Merci,

    Pichto

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Ah oui, tant qu'on y est :

    puis-je faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     (SELECT firstname,lastname
    FROM table1
    WHERE firstname LIKE '%e%'
    INTERSECT
    SELECT DISTINCT firstname, lastname
    FROM table1 t1, table2 t2
    WHERE t1.id = t2.private_data_id
    AND description='tennis' AND description='natation')
    INTERSECT
    une autre requête...
    Donc, trouver le résultat de l'intersection de l'intersection de la 1ère et de la 2ème requête avec une 3ème (clair?).

    Merci,

    Pichto

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 802
    Points
    30 802
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT firstname, lastname
    FROM table1 t1, table2 t2
    WHERE t1.id = t2.private_data_id
    AND description='tennis' AND description='natation'
    Je doute que ta requête retourne le moindre enregistrement
    Comment trouver un enregistrement dont la colonne description contient simultanément 'tennis' et 'natation' ?

    Pour trouver les personnes qui font simultanément du tennis et de la natation, une solution serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT    firstname, lastname
    FROM    table1 AS t1
    WHERE    EXISTS
        (    SELECT    1
            FROM    table2 AS t2
            WHERE     t1.id = t2.private_data_id
                AND description IN ('tennis', 'natation')
            HAVING COUNT(DISTINCT description) = 2    
        )
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci al1_24,

    Ta solution a l'air de fonctionner. J'ai du la modifier un brin (merci Access) et voici ce à quoi je suis parvenu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT id,firstname, lastname
    FROM  table1 AS t1
    WHERE EXISTS (SELECT private_data_id 
    FROM table2 AS t2 WHERE t1.id = t2.private_data_id AND t2.description IN ('tennis','natation')
    GROUP BY private_data_id HAVING COUNT(*) = 2);
    maintenant, une autre question :

    Comment dois-je faire si je veux rechercher tous ceux qui s'appellent 'alain' et qui font du tennis et de la natation ? J'ai essayé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT id,firstname, lastname
    FROM  table1 AS t1
    WHERE t1.firstname='alain' AND EXISTS (SELECT private_data_id
    FROM table2 AS t2
    WHERE t1.id = t2.private_data_id AND t2.description IN ('tennis','natation')
    GROUP BY private_data_id HAVING COUNT(*) = 2);
    mais ça n'a pas l'air de marcher.

    Merci de ton/votre aide!!

    Pichto

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Ca marche!!
    Correction :

    J'ai du faire une faute d'erreur car à présent ça fonctionne parfaitement.

    Merci pour tout!!

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

Discussions similaires

  1. Une Legend sur plusieurs lignes ou colonnes
    Par Copepode dans le forum MATLAB
    Réponses: 4
    Dernier message: 26/05/2021, 10h53
  2. [XL-2010] insérer une image sous condition sur plusieurs lignes
    Par jesslab dans le forum Excel
    Réponses: 2
    Dernier message: 06/12/2013, 09h35
  3. [DOM] Déclarer une variable sur plusieurs lignes
    Par fgallnii dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 28/10/2008, 15h32
  4. Réponses: 2
    Dernier message: 02/05/2007, 17h08
  5. [TStringGrid] Une cellule sur plusieurs lignes.
    Par Caine dans le forum Delphi
    Réponses: 15
    Dernier message: 28/03/2007, 12h53

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