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 :

Condition in mais limité


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 7
    Par défaut Condition in mais limité
    Hello,

    Je reviens sur un sujet que j'avais abordé il y a quelques semaines, je souhaite créer une requête au résultat suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * 
    FROM toto 
    LEFT JOIN titi ON toto.id = titi.toto_id
    WHERE titi.id IN (1, 3, 5, 6) --, mais limitée
    J'avais eu une réponse avec quelque chose donnant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT *
    FROM toto 
    LEFT JOIN titi ON toto.id = titi.toto_id
    WHERE ((titi.id = 1) + (titi.id = 3) + (titi.id = 5) + (titi.id = 6))
    En mettant en place
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *,
    ((titi.id = 1) + (titi.id = 3) + (titi.id = 5) + (titi.id = 6))
    FROM toto 
    LEFT JOIN titi ON toto.id = titi.toto_id
    WHERE ((titi.id = 1) + (titi.id = 3) + (titi.id = 5) + (titi.id = 6))
    Mon champ contenant le retour de l'"addition" n'est jamais supérieur à 1.

    Je me demande s'il n'y a pas un problème dans ma jointure.

    Merci d'avance pour votre aide

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par angeloo Voir le message
    Hello,

    Je reviens sur un sujet que j'avais abordé il y a quelques semaines, je souhaite créer une requête au résultat suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * 
    FROM toto 
    LEFT JOIN titi ON toto.id = titi.toto_id
    WHERE titi.id IN (1, 3, 5, 6) --, mais limitée
    Que veux-tu dire par "limitée" ?

    J'avais eu une réponse avec quelque chose donnant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT *
    FROM toto 
    LEFT JOIN titi ON toto.id = titi.toto_id
    WHERE ((titi.id = 1) + (titi.id = 3) + (titi.id = 5) + (titi.id = 6))
    Le WHERE va évaluer chaque égalité et lui donner la valeur 1 si elle est vraie ou 0 si elle est fausse, ceci pour chaque titi.id. Comme à chaque ligne titi.id ne peut prendre qu'une valeur, le résultat du WHERE sera au maximum de 1. Bref, je ne vois vraiment pas l'utilité de cette addition dans le WHERE !

    En mettant en place
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *,
    ((titi.id = 1) + (titi.id = 3) + (titi.id = 5) + (titi.id = 6))
    FROM toto 
    LEFT JOIN titi ON toto.id = titi.toto_id
    WHERE ((titi.id = 1) + (titi.id = 3) + (titi.id = 5) + (titi.id = 6))
    Mon champ contenant le retour de l'"addition" n'est jamais supérieur à 1.
    Normal, j'ai expliqué pourquoi plus haut : il n'y a qu'une valeur de titi.id pour chaque ligne résultat de la requête donc une seule égalité évaluée à vrai donc à 1, les autres à 0 et 1 + 0 + 0 + 0 = 1.

    Explique plus clairement ce que tu cherches à faire.

    Et au passage, évite de te lancer dans la guerre des étoiles !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 7
    Par défaut
    Hello,

    Merci de t'intéresser à mon problème

    Je vais peut-être mettre cela en "français":

    On a une liste de références (toto), ces références sont liées à des mots clés (titi).

    L'idée est de pouvoir retourner, une liste de référence liées à au moins X mots clés, parmi une liste données (la liste est composées des valeurs dont je parlais dans le IN de ma premier code).

    Pour les étoiles, c'est juste pour la base de la requete, après j'optimise, merci du conseil

    Merci d'avance

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par angeloo Voir le message
    L'idée est de pouvoir retourner, une liste de référence liées à au moins X mots clés, parmi une liste données (la liste est composées des valeurs dont je parlais dans le IN de ma premier code).
    Donc si je comprends bien, tu veux les lignes de toto qui sont en correspondance avec les 4 valeurs de titi.id au moins.

    Il faut procéder à un comptage, donc à un regroupement et ne retenir que les regroupements dont le comtpage est au moins égal à 4 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT toto.id
    FROM toto
    INNER JOIN titi ON titi.id = toto.id
    WHERE titi.id IN (1, 3, 5, 6)
    GROUP BY toto.id
    HAVING COUNT(*) > 3
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 7
    Par défaut
    Parfait ça fonctionne!

    Merci bcp, juste petite modif sur la jointure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT toto.id
    FROM toto
    INNER JOIN titi ON titi.toto_id = toto.id
    WHERE titi.id IN (3, 6, 10, 13)
    GROUP BY toto.id
    HAVING COUNT(*) > 3
    Me reste plus qu'à comprendre bien pourquoi faut faire comme cela

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par angeloo Voir le message
    Me reste plus qu'à comprendre bien pourquoi faut faire comme cela
    Ben j'ai un peu expliqué la démarche dans mon précédent message en reformulant ton besoin !

    Le WHERE opère une restriction sur les lignes résultant de la jointures entre les deux tables.
    Le HAVING opère une restriction sur le résultat du comptage, donc du regroupement.

    La requête pourrait être traduite en français par :
    Sélectionner toto.id
    de la table toto
    jointe à la table titi sur le fait que toto.id = titi.toto_id
    en ne gardant que les lignes où la valeur de titi.id est dans l'ensemble {3, 6, 10, 13}
    grouper les lignes par toto.id
    et ne garder que les groupes qui ont plus de 3 lignes (donc au moins les 4 valeurs voulues).
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

Discussions similaires

  1. Réponses: 18
    Dernier message: 07/10/2010, 02h18
  2. Where in mais limité
    Par angeloo dans le forum Requêtes
    Réponses: 3
    Dernier message: 06/09/2010, 08h55
  3. Copier un fichier dans un espace choisi mais limité?
    Par dtcSearch dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 05/01/2010, 09h54
  4. Condition correcte mais pose probleme
    Par Vincinho dans le forum Visual Studio
    Réponses: 2
    Dernier message: 12/11/2009, 11h32
  5. Condition simple mais..
    Par JeanMikael dans le forum VBA Access
    Réponses: 8
    Dernier message: 19/09/2007, 09h46

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