Problème double requête même table, même champ

Signaler
Messages postés
29
Date d'inscription
mardi 16 septembre 2008
Statut
Membre
Dernière intervention
4 novembre 2010
-
cs_Robert33
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
-
Bonjour,

j'ai un problème que pour avoir le résultat voulu en une seul requête.

Les deux table concernées

Notices

notice_id || tit1 || indexint


Notices_custom_value

notices_custom_champ || notices_custom_origine || notices_custom_integer



La table notice contient des ouvrages, indexint permet de les retrouver par thème (je ne dois piocher que dans une certaine plage d'ID .

SELECT DISTINCT n.notice_id, n.tit1, n.indexint FROM notices AS n WHERE n.indexint BETWEEN 5325 AND 5356 AND n.indexint="5339"(le thème recherché).



jusque là, pas de problème.
Mais je dois aussi pouvoir affiner ma recherche avec le public cible, le support
Que l'on retrouve dans la table notices_custom_value.
Et que l'on peut retrouver en fonction de la valeur de notices_custom_champ 5=public 2=support et le type se trouvent dans la colonne notices_custom_integer.
donc pour un ouvrage ayant un thème spécifique et un public donné, cela donnerait
SELECT DISTINCT n.notice_id, n.tit1, n.indexint FROM notices AS n INNER JOIN notices_custom_values ncv ON ncv.notices_custom_origine = n.notice_id WHERE n.opac_visible_bulletinage=1 AND n.indexint BETWEEN 5325 AND 5356 AND ncv.notices_custom_champ=5  AND  ncv.notices_custom_integer=4 AND ncv.notices_custom_champ=2  AND  ncv.notices_custom_integer=15



Mais bien entendu ça coince...

Si je ne suis pas assez clair, n'hésitez pas à me le dire =)

Merci d'avance pour ceux qui répondront

6 réponses

Messages postés
40
Date d'inscription
mardi 16 février 2010
Statut
Membre
Dernière intervention
6 février 2012

Salut

La table 'Notices' ne contient pas le champ 'opac_visible_bulletinage' !!
Messages postés
40
Date d'inscription
mardi 16 février 2010
Statut
Membre
Dernière intervention
6 février 2012

Pense à utiliser 'Or' à la place de 'AND' en fonction de ce que tu veux avoir comme résultat, d'ailleurs dans ta première requète, tu dis (le thème recherché) je comprends de là que tu cherche bien l'index 5339 alors pourquoi ajouter la première condition :
(n.indexint BETWEEN 5325 AND 5356 )  
?.

et dans la deuxième requête tu as mis comme condition :
(ncv.notices_custom_champ 5) AND (ncv.notices_custom_integer 4) AND 
                      (ncv.notices_custom_champ 2) AND (ncv.notices_custom_integer 15) 

je t'assure que tu n'aura jamais de résultat avec ces conditions là, vu qu'un champ d'une table ne prend qu'une seule valeur à la fois !!

donc essais de revoir ta requête et si jamais tu as d'autres soucis n'hésite pas à les poster !

bon courage
Messages postés
29
Date d'inscription
mardi 16 septembre 2008
Statut
Membre
Dernière intervention
4 novembre 2010

merci d'avoir répondu =)

le champ opac_visible_bulletinage existe bien, je ne me suis pas amusé à donner tout les champs des tables, mais juste ceux dont j'ai besoin. Par facilité et lisibilité

(n.indexint BETWEEN 5325 AND 5356 )

Il sert à ne pas faire ressortir les notices dont on a pas besoin quand il n'y a pas de recherche sur le thème.



(ncv.notices_custom_champ 5) AND (ncv.notices_custom_integer 4) AND 
                      (ncv.notices_custom_champ 2) AND (ncv.notices_custom_integer 15) 


je t'assure que tu n'aura jamais de résultat avec ces conditions là, vu qu'un champ d'une table ne prend qu'une seule valeur à la fois !!

Je sais bien, et c'est bien de là que vient mon problème. c'est que je ne vois pas comment faire pour rechercher un public et un support en même temps.

Ou à la limite construire la requête en deux temps. D'abord recherche sur thème avec un support ou un public, garder les id de ces notices et relancer un recherche pour affiner. Et tout ça sans que le visiteur ne le voit bien sûr =)
Messages postés
40
Date d'inscription
mardi 16 février 2010
Statut
Membre
Dernière intervention
6 février 2012

c'est quoi exactement le résultat que tu veux avoir ?!?

sinon à ce que j'ai compris tu peux faire ceci :
((ncv.notices_custom_champ 5) AND (ncv.notices_custom_integer 4))OR
                      ((ncv.notices_custom_champ 2) AND (ncv.notices_custom_integer 15))
Messages postés
29
Date d'inscription
mardi 16 septembre 2008
Statut
Membre
Dernière intervention
4 novembre 2010

j'aimerais pouvoir faire ressortir les notices qui ont un thème précis et un public donné ainsi qu'un support spécifique.
((ncv.notices_custom_champ 5) AND (ncv.notices_custom_integer 4))OR
                      ((ncv.notices_custom_champ 2) AND (ncv.notices_custom_integer 15))



Et pour situer le contexte, j'ai développé un moteur de recherche d'outils pédagogiques. Qui recherche sur deux banques de données.
Et ce moteur permet de rechercher les outils suivant le thème, le support, le public et l'approche.

Sur l'autre bdd je n'ai pas de problème pour effectuer la recherche et sortir les résultats. Mais sur celle-ci, le support, le public et l'approche sont tous dans la même table
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
27
Bonsoir

ce post est un peu vieux, et tu as peut être déjà la solution...

si non, il faut que tu fasses autant de jointures sur la table Notices_custom_value que tu as de conditions a tester:
exemple avec 2 conditions sur les champs 2 et 5:

SELECT DISTINCT n.notice_id , n.tit1 , n.indexint FROM notices n 
  INNER JOIN notices_custom_values ncv1 ON n.notice_id ncv1.notices_custom_origine AND ncv1.notices_custom_champ 5 
  INNER JOIN notices_custom_values ncv2 ON n.notice_id ncv2.notices_custom_origine AND ncv2.notices_custom_champ 2
  WHERE (n.opac_visible_bulletinage = 1) AND (n.indexint BETWEEN 5325 AND 5356) 
    AND (ncv1.notices_custom_integer = 2) 
    AND (ncv2.notices_custom_integer = 7)


Bob.