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 :

Conditions complémentaire dans le WHERE si une valeur spécifique est trouvée dans un champs


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2009
    Messages : 58
    Par défaut Conditions complémentaire dans le WHERE si une valeur spécifique est trouvée dans un champs
    Bonjour,

    Voilà, je suis confronté à un cas que je n'ai jamais rencontré.
    J'ai une requête déjà pas mal dense, pour laquelle je souhaiterais ajouter des clauses spécifiques UNIQUEMENT SI certaines conditions sont remplies par les données de la ligne courante J'espère être clair.

    Pour rentrer dans le détail :

    Une table dans laquelle je stock des demandes, pour certaines j'ai un clé étrangère rattachée à une table contenant des données de sociétés.

    Je souhaite pourvoir dire que :

    Si j'ai un ID dans ma table demande, je dois valider plusieurs conditions avant de prendre la ligne dans mon recordset et si pas d'ID, alors pas de souci je prends la ligne quoi qu'il arrive.
    Je pense donc qu'il faut utiliser IF() dans la clause WHERE, et pour le coup je but la dessus.
    Dans mon SELECT j'ai quelques conditions que je crois devoir réintégrer dans le WHERE pour mes tests

    EX :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IF(d.insurancecompanyid IS NOT NULL AND TIMESTAMPDIFF(MINUTE, d.createdat, NOW()) <= 2400, 'true', 'false') AS insuranceexclusive
    Qui retourne TRUE / FALSE si il y a une exclusivité en cours sur l'enregistrement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    d.insurancecompanyid, DATE_ADD(d.createdat, INTERVAL 2400 MINUTE) AS insuranceexclusivedat
    Qui me donne une date d'expiration de l'exclusivité en fonction de la date de création de l'enregistrement.

    En gros dans mon IF du WHERE, j'ai besoin de dire que SI j'ai un ID assurance, que la date n'est pas dépassée, ET que le porteur de la demande est bien présent dans une autre table de jointure que j'ai entre les companies et les users, alors je peux décider de prendre ou pas.

    Je partais sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    IF(
        d.insurancecompanyid IS NOT NULL
        AND d.insurancecompanyid IS NOT NULL AND TIMESTAMPDIFF(MINUTE, d.createdat, NOW()) <= 2400, 'true', 'false') = 'true'
        AND (
            SELECT COUNT() pour savoir si j'ai un retour sur ma dernière table...
        )
    )
    Mais ... ben je n'y parviens pas.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2009
    Messages : 58
    Par défaut
    En ajoutant cette clause,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    AND (
     		IF(d.insurancecompanyid IS NOT NULL 
     			AND TIMESTAMPDIFF(MINUTE, d.createdat, NOW()) <= 2400 
     			AND (
     				SELECT COUNT(insuranceagreements.insurancecompanyid)
     				FROM insuranceagreements
     				WHERE insuranceagreements.insurancecompanyid = d.insurancecompanyid
     					AND insuranceagreements.customerid = a.customerid
     			) > 0, 'true', 'false') 
     	) = 'true'
    J'ai cette partie qui semble fonctionner quand j'ai un enregistrement dans la table de relation "insuranceagreements", mais j'ai une erreur si pas d'enregistrement

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2009
    Messages : 58
    Par défaut
    Ben si finalement ça fonctionne

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2009
    Messages : 58
    Par défaut
    Alors en fait, non c'est pas exactement ce qu'il me faut.
    Je me rend compte que dans le cas présenté, j'ai n'est un traitement correct que si toutes les conditions sont remplis.
    du coup en l'état ça retourne false, donc l'enregistrement n'est pas dans le recordset.

    Je doit reprendre car le cas ou le délai est expiré doit me retourné l'enregistrement. En fait si le délai est expiré, je ne doit pas m'en préoccuper.

    Je cherche toujours de l'aide du coup.
    d'avance merci

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 636
    Billets dans le blog
    10
    Par défaut
    Bonsoir,

    Pour les conditions complexes, l'utilisation de CASE WHEN ... permet de simplifier l'écriture

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select Colonne1
         , Colonne2
         , [...]
    from ma_table
    where case when colonne1 between 5 and 10 and colonne 2 > 100 then 1
               when colonne1 > colonne3 and colonne3 < 10 then 1
               when colonne2 > colonne 1 or colonne1 is null then 1
               else 0
          end as bool=1

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2009
    Messages : 58
    Par défaut
    Merci @escartefigue, je n'ai effectivement jamais utilisé cela, je vais modifier mon code pour intégrer cette approche.
    Bon début de journée.

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2009
    Messages : 58
    Par défaut
    Effectivement c'est bien plus clair et ça fonctionne.
    un grand merci pour le coup de main.

    Voici la trace du refactoring

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    AND CASE 
    		WHEN d.insurancecompanyid IS NULL THEN 1
    		WHEN d.insurancecompanyid IS NOT NULL 
    			AND TIMESTAMPDIFF(MINUTE, d.createdat, NOW()) > 60 THEN 1
    		WHEN d.insurancecompanyid IS NOT NULL 
    			AND TIMESTAMPDIFF(MINUTE, d.createdat, NOW()) <= 60
    			AND  (
    				SELECT COUNT(insuranceagreements.insurancecompanyid)
    				FROM insuranceagreements
    				WHERE insuranceagreements.insurancecompanyid = d.insurancecompanyid
    					AND insuranceagreements.customerid = a.customerid
    			) > 0 THEN 1
    		END

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

Discussions similaires

  1. SimpleXML : Condition IF ne fonctionne pas avec une valeur numérique
    Par Abpostman1 dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 05/11/2018, 07h47
  2. [XL-2010] Récupération de valeurs associées une valeur spécifique dans une ComboBox
    Par VBA_beginner dans le forum Macros et VBA Excel
    Réponses: 22
    Dernier message: 02/09/2015, 17h51
  3. Réponses: 10
    Dernier message: 12/09/2008, 10h09
  4. Réponses: 13
    Dernier message: 05/11/2007, 09h00
  5. Réponses: 7
    Dernier message: 28/01/2007, 11h38

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