Page 1 sur 1

Faire un "OU BIEN"

Posté : 07 déc. 2008, 16:25
par katagoto
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 : Tout sélectionner

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 : PostGreSQL 8.3.5
PPS : J'ai déjà cherché sur la doc, sur le forum et sur internet
PPPS :

Code : Tout sélectionner

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 ?

Posté : 08 déc. 2008, 04:54
par Patriboom
Je crois qu'une façon peu évoluée de faire serait d'opter pour des IF et des sous-requêtes.
De base; collée à la logique habituelle.
J'ai en tête une autre méthode, mais je n'arrive pas à me rappeler la commande, aussi suis bloqué, mais je suis sûr qu'il y a plus simple que ceci:

Code : Tout sélectionner

SELECT membres.*, membre.pseudo CASE WHEN Count(SELECT fk_ligne FROM ref_ligne WHERE fk_membre = xyz) > 0 THEN (SELECT fk_ligne FROM ref_ligne WHERE fk_membre = xyz ORDER BY pk_ref DESC) AS Ligne WHEN [condition qui véirifie s'il y a une ligne antérieurement définie] THEN [on reprend la sous-requête et on lui donne le même pseudo] AS Ligne ELSE [La valeur par défaut qui arrive à la fin de toutes les conditions non satisfaites] AS Ligne END CASE FROM membres, membre, ref_ligne, ligne
Ci-haut, ce n'est qu'une piste.

Posté : 08 déc. 2008, 19:22
par katagoto
Bonjour, merci de te réponse, mais les prédicats ne sont pas accepter dans la clause WHERE, seulement dans HAVING, voir GROUP BY (qui est très chiant, au passage) deplus IF n'est valable que dans le PL/pgsql ^^

J'ai tenté un truc comme ça :

Code : Tout sélectionner

SELECT DISTINCT membre.pseudo, membres.pk_ligne, membres.fk_categorie, ligne.fondateur, categorie.niveau, COUNT(ligne.*) AS nb_ligne FROM liste_categorie AS categorie, liste_dategorie AS categorie2,membres, membre, ref_ligne, ligne com_r_droits AS droits, droits_r_profil AS profil WHERE categorie2.pk_categorie=1 AND categorie."BordDroit"<=categorie2."BordDroit" AND categorie."BordGauche">=categorie2."BordGauche" AND ligne.fk_categorie=1 AND membres.fk_categorie=categorie.pk_categorie AND ( (ref_ligne.fk_membre=membres.fk_membre AND ligne.pk_ligne=droits.fk_ligne) OR (ligne.fondateur=categorie.pk_categorie AND ref_ligne.fk_membre<>membres.fk_membre) OR (ligne.defaut=0 AND ref_ligne.fk_membre<>membres.fk_membre) ) AND membre.pk_membre=membres.fk_membre GROUP BY membres.pk_ligne, membre.pseudo, membres.fk_categorie, ligne.fondateur, categorie.niveau
Lorsque j'enlève le COUNT, je suis à 40, lorsque je le met, je suis a 81, que faire ?

Par avance merci de votre aide

Posté : 08 déc. 2008, 19:54
par Patriboom
Si IF, HAVING, COUNT et cie donnent des résultats inadéquats ... reste-t-il autre option que de traiter en PHP selon les résultats obtenus?

Posté : 08 déc. 2008, 20:42
par katagoto
:/
Ca ferait mal de devoir traité 3.000 lignes pour 20 membres en PHP, déjà avec PostGreSQL ça me prend 0.750s