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 :

Présence de plusieurs numéros peu importe l'ordre


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 306
    Points : 106
    Points
    106
    Par défaut Présence de plusieurs numéros peu importe l'ordre
    Bonjour,

    Je cherche a faire une requete verifiant la présence de numeros dans la base de données un peu comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT pseudo FROM loterie WHERE (numero1 = :numero1 AND numero2 = :numero2) OR (numero1 = :numero2 AND numero2 = :numero2)
    Numero1 et Numero2 doivent être présents dans numero1 et ou numero2 peu importe l'ordre.

    N'y a t-il pas plus simple que ce que j'ai ecrit pour éventuellement pouvoir faire cetet requete avec 3 numéros ?


    Merci d'avance pour votre réponse,
    Cordialement,

  2. #2
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2010
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 44
    Points : 69
    Points
    69
    Par défaut
    Bonsoir,

    Je vous propose ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    select pseudo
       from (             SELECT numero1 as numero, pseudo  FROM loterie
                UNION ALL SELECT numero2 as numero, pseudo  FROM loterie
               )
    where numero in (:numero1,:numero2,:numero3)
    Cdlt,
    OD

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    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 099
    Points : 28 390
    Points
    28 390
    Par défaut
    Cette requête sera peut être plus efficace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT  pseudo
    FROM    loterie
    WHERE   numero1 IN (:numero1,:numero2,:numero3)
    UNION
    SELECT  pseudo
    FROM    loterie
    WHERE   numero2 IN (:numero1,:numero2,:numero3)

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Attention, la requête proposée à base d'union n'est pas équivalente à la requête initiale.
    Par exemple, si dans la table il y a (pseudo='a', numero1=1, numero2=2) et qu'on compare ça au tirage (1,3), alors elle va sortir 'a' comme solution, ce qui est faux. Seuls les tirages (1,2) ou (2,1) sont censés correspondre à l'entrée 'a'.

    Faute de voir une réponse en SQL basique, pour ma part je proposerais une solution qui utilise les tableaux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select pseudo from loterie
     where array[numero1,numero2,numero3] @> array[:n1, :n2, :n3]
     and  array[:n1, :n2, :n3]  @> array[numero1,numero2,numero3]
    La syntaxe est celle de PostgreSQL, mais ça peut sûrement être adapté pour un autre SGBD ayant le concept de tableau.
    T1 @> T2 signifie que le tableau T1 contient le tableau T2. En disant que T1 contient T2 et que T2 contient T1, ça exprime le fait que T1 et T2 contiennent les mêmes éléments indépendamment de leurs positions, ce qui est normalement équivalent à ce que teste la requête initiale avec la série de OR et AND.

  5. #5
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2010
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 44
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    Effectivement estofilo, je n'avais pas bien lu l'énoncé ...

    Je vous propose la requête 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
    17
    18
    19
     
    with l as (
          select pseudo, numero1 numero , 1 as origine from loterie
    union select pseudo, numero2 numero , 2 as oridine from loterie
    union select pseudo, numero3 numero , 3 as origine from loterie
    ), p as (
    select l1.pseudo, l1.numero as numero1, l2.numero as numero2, l3.numero as numero3
      from l as l1
           CROSS JOIN l as l2 on     l2.pseudo  =  l1.pseudo
                                 and l2.origine <> l1.origine
           CROSS JOIN l as l3 on     l3.pseudo = l1.pseudo
                                 and l3.origine <> l1.origine
                                 and l3.origine <> l2.origine
    )
    select p.pseudo
      from p
     where p.numero1 = :numero1
       and p.numero2 = :numero2
       and p.numero3 = :numero3
    Explication :
    La vue virtuelle "l" fait la liste de tous les numeros par pseudo.
    J'y adjoint une colonne "origine" contenant un litéral 1,2 ou 3, rappellant l'origine de la colonne.
    --> C'est une opération de type UNPIVOT

    La vue virtuelle "p" constitue toutes les combinaisons possibles de numero1, numero2 et numero3 en utilisant un produit cartésien sur "l"

    La dernière partie sert enfin à répondre à la question posée ...


    Je n'ai pas testé sur un jeu de données, mais je pense que ça devrait marcher. (edit: Je suppose que "pseudo" est une clé)


    Cdlt,
    OD

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    CROSS JOIN par définition ne supporte pas de prédicat de jointure.

Discussions similaires

  1. [XSD] Plusieurs element dans n'importe quel ordre.
    Par Ldoppea dans le forum Valider
    Réponses: 2
    Dernier message: 24/09/2010, 09h43
  2. Export avec compress mais plusieurs extent à l'import
    Par Korfandar dans le forum Administration
    Réponses: 1
    Dernier message: 12/05/2008, 18h30
  3. Réponses: 4
    Dernier message: 28/10/2007, 20h01
  4. Signaler plusieurs numéros par modem avec Delphi 7
    Par Ralliart dans le forum Débuter
    Réponses: 0
    Dernier message: 17/09/2007, 03h43
  5. [Peu important]JTable effacer colonne
    Par leminipouce dans le forum Composants
    Réponses: 6
    Dernier message: 07/12/2005, 17h30

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