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 PostgreSQL Discussion :

Faire un "OU BIEN"


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité2
    Invité(e)
    Par défaut Faire un "OU BIEN"
    Bonjour à toutes et à tous,

    Voilà, je suis confronté à un problème, j'ai une liste de membre et je dois sortir un objet, une ligne, mais pas n'importe quelle ligne, j'ai le choix entre trois sorte de lignes : la ligne qu'il a définit lui même, la dernière qu'il a entrée ou bien la ligne qui lui est attribué par défaut... C'est un trie ^par ordre d'importance, j'ai donc tenté ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT membres.*, membre.pseudo
       FROM membres, membre, ref_ligne, ligne
     
       WHERE categorie2.pk_categorie=1 AND categorie."BordDroit"<=categorie2."BordDroit" AND categorie."BordGauche">=categorie2."BordGauche" AND membres.fk_membre=categorie.fondateur AND ((ref_ligne.fk_membre=membres.fk_membre AND ligne.pk_ligne=ref_ligne.fk_ligne)
                 OR ligne.defaut=categorie.pk_categorie --Un membre peut-être le fondateur de plusieurs catégories, j'aimerais, aussi, que ce prédicats soit valide et validé uniquement si le membre n'est le fondateur d'une seule catégorie, comment faire :/
                 OR ligne.defaut=0
                 )
                AND ligne.fk_categorie=1
                AND membre.pk_membre=membres.fk_membre
    Voilà, le problème, c'est que je n'arrive à faire ce choix par "défaut", du coups, j'ai 2.772 lignes alors que je n'ai que 20 membres et 13 categories...

    Comment pourrais-je faire ce "OU BIEN", par avance merci de votre aide...

    Par avance merci de votre aide

    PS : J'ai déjà cherché sur la doc, sur le forum et sur internet
    PPS :
    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
    CREATE TABLE categorie --géré par Représentation Intervallaire
    (
      pk_categorie serial,
      "BordGauche" integer,
      "BordDroit" integer,
      fondateur integer, --contient l'id d'un membre
      CONSTRAINT categorie_pkey PRIMARY KEY (pk_categorie)
    )
     
    CREATE TABLE ref_ligne
    (
      pk_ref serial,
      fk_membre integer,
      fk_ligne integer,
      CONSTRAINT ref_ligne_pkey PRIMARY KEY (pk_ref)
    )
    Je n'ai mit que les tables qui pouvait avoir de l'importance
    PPPS : J'ai tenté un COUNT szur ligne, ce qui m'a renvoyé une belle erreur, pourquoi ?

  2. #2
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Par défaut
    déjà, utilise la syntaxe normalisée pour les jointures qui te permettra de distinguer facilement ce qui concerne les conditions de jointures des filtres. Ainsi p-e n'oublieras-tu point de conditions de jointures à l'origine de la multiplication des lignes.

    Ensuite, la fonction coalesce() est ton amie : elle te retourne son premier argument non null. Ainsi coalesce(ligneDefinie, dernièreLigneEntrée, ligneParDefaut) te retournera la valeur que tu souhaite par ordre de priorité.

    Par ailleurs, ils faut que tu nous éclaire sur les tables membres et membre. Car si (de ce que je comprend de la requête) un membre (de la table membres) peu avoir plusieurs pseudo, la jointure de ces 2 tables (et donc ton résultat) comportera inexorablement plus de lignes que tu n'as de membre.

  3. #3
    Invité2
    Invité(e)
    Par défaut
    Merci,

    Alors, membres comporte trois champs : l'id de la ligne, l'id du membre et l'id de la catégorie, membre contient diverse information dont le pseudo du membren j'ai réduit le nombre de ligne à 81 (pour 20 membres) en ajoutant DISTINCT, ce qui me retourne à peu pret ce que je voulais, mais je dois quand même les traité après (en PHP)...
    Pour les conditions, j'en ai rajouté plein, enlevé plein, j'ai toujours les mêmes lignes et le même nombre de ligne :/
    Si vous avez une solution, je prend

    Par avance merci de votre aide

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