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 :

une condition complexe


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de sami_c
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Mai 2002
    Messages
    764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 764
    Par défaut une condition complexe
    Bonjour
    Dans ma table, j'ai une colonne JOUR qui comporte 7 bits, chaque bit correspond à un jour de semaine
    Exp : 1 1 1 0 1 0 0
    Lun Ma Me Je Ve Sa Di

    Je voudrais afficher les enregistrement dont la colonne JOUR correspond par exemple à la valeur 1101100, sauf que la condition est un peut complexe, en fait il faut aussi prendre en compte 1111100 ou encore 1000001 ... bref n'importe quelle valeur à condition qu'elle ait au moins un 1 qui colle avec ce qu'on cherche
    Peut-on faire ceci dans une requete sql ?

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Comme dans beaucoup de langages, pour ce type de problème, on utilise l'opérateur XOR bit-à-bit (bitwise XOR): ^

    Voir ici: http://dev.mysql.com/doc/refman/5.0/...functions.html
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  3. #3
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 670
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 670
    Par défaut Re: une condition complexe
    Citation Envoyé par sami_c
    Je voudrais afficher les enregistrement dont la colonne JOUR correspond par exemple à la valeur 1101100,
    en clair ta condition avec 01101100 c'est de trouver les enregistrement où il y a au moins les lundi mardi jeudi et vendredi ?
    si c'est ça essaye cette condition (108 c'est 01101100 en décimal):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... WHERE (JOUR & 108 = 108)
    edit : grilled

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut Re: une condition complexe
    Citation Envoyé par mathieu
    en clair ta condition avec 01101100 c'est de trouver les enregistrement où il y a au moins les lundi mardi jeudi et vendredi ?
    si c'est ça essaye cette condition (108 c'est 01101100 en décimal):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... WHERE (JOUR & 108 = 108)
    Euh... oui, pardon. C'est toi qui a raison mathieu. C'est bien le ET bit-à-bit qu'il faut utiliser.

    2 minutes plus tôt, je résolvais un problème faisant intervenir le XOR bit-à-bit, donc je me suis emmellé les pinceaux. Désolé




    Pour compléter ce que dit mathieu,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... WHERE (JOUR & 108 = 108)
    correspond aux enregistrements pour lesquels on a à la fois lundi mardi jeudi et vendredi.



    Si tu veux les enregistrements pour lesquels on a au moins des jours considérés (lundi mardi jeudi et vendredi), alors
    suffit.




    ***
    Sinon, niveau conception de la base de données, il y a encore plus simple avec une colonne de type SET:
    http://dev.mysql.com/doc/refman/5.0/en/set.html

    Dans ce cas, on utilise directement les noms des jours (ou pas) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM tbl_name WHERE FIND_IN_SET('lundi', jour) OR  FIND_IN_SET('mardi', jour) ;
    SELECT * FROM tbl_name WHERE jour = 'lundi,mardi';
    SELECT * FROM tbl_name WHERE jour & 108 ;
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  5. #5
    Membre éclairé Avatar de sami_c
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Mai 2002
    Messages
    764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 764
    Par défaut
    Exemple :

    Les différentes valeurs sont :
    1110100
    1111100
    0000010
    0001000
    0000001

    'Masque' de recherche :
    1110100 (116 en décimal)

    Ce que je devrais avoir :
    1110100
    1111100

    Résultat de la requete ...WHERE ( jour & 116)
    1110100
    1111100
    0001000

    Comment faire pour ne pas avoir le 0001000 ?

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    C'est bizarre: normalement (1110100 & 0001000) = 0
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  7. #7
    Membre éclairé Avatar de sami_c
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Mai 2002
    Messages
    764
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 764
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT 1110100 & 0001000
    Résultat : 64 !!!! pourquoi ça ne donne pas 0 ????!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT convert(1110100, BINARY)  & convert(0001000, BINARY)
    idem !!!!
    par contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT convert(116, BINARY)  & convert(8, BINARY)
    donne bien 0
    meme résultat avec
    116 (decimal) = 1110100
    8 = 0001000
    Donc on doit décoder en décimal pour faire la multplication bit par bit, et pour ça on utilise la fonction CONV(N, base1, base)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT conv(1110100,2,10)  & conv(0001000,2,10)
    donne ENFIN un 0 !!!!!!!!!!

  8. #8
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Citation Envoyé par sami_c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT 1110100 & 0001000
    Résultat : 64 !!!! pourquoi ça ne donne pas 0 ????!!!
    Nous, on donnait la représentation en binaire pour que ce soit plus facile à comprendre (parce que lire du binaire, c'est pas évident ). Evidemment qu'il fallait convertir en base 10 avant ! (mais c'est bien: tu as fini par le comprendre)

    Tant mieux, le problème est "Résolu" maintenant...
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

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

Discussions similaires

  1. Deux requêtes en une avec sommes et conditions complexes
    Par Dr_No dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 05/10/2012, 17h57
  2. Requete plus ou moin complexe avec une condition
    Par tidou95220 dans le forum Requêtes
    Réponses: 1
    Dernier message: 07/05/2012, 22h46
  3. Faire une requete complexe avec des conditions
    Par student_php dans le forum Requêtes
    Réponses: 4
    Dernier message: 22/11/2010, 10h09
  4. comment vérifier qu'une table esclave vérifie une condition?
    Par loikiloik dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/04/2004, 16h48
  5. Encore une requête complexe sur plusieurs tables
    Par DenPro dans le forum Langage SQL
    Réponses: 5
    Dernier message: 09/12/2003, 19h05

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