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

Langage SQL Discussion :

[SQL] récupérer la liste de mes thèmes issus arbre booléens


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Avatar de guipom
    Inscrit en
    Janvier 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 207
    Points : 184
    Points
    184
    Par défaut [SQL] récupérer la liste de mes thèmes issus arbre booléens
    Bonjour,

    Sur le coup je pensais que ca serait simple, mais je bloque sans y arriver donc je préferre poser la question.

    Voici la structure de ma base de données : http://guipom.free.fr/public/structure.jpg

    Je génère dans un premier temps une requête du type :

    SELECT DISTINCT m.idmedia,m.titre,m.url,m.typemedia,l.codeinsee,l.echelle FROM geopos_media m LEFT OUTER JOIN geopos_localisation l ON m.idmedia=l.idmedia LEFT OUTER JOIN geopos_themes th ON m.idmedia=th.idmedia LEFT OUTER JOIN geopos_descr des ON m.idmedia=des.idmedia WHERE (m.typemedia='Texte' OR m.typemedia='Statistiques' OR m.typemedia='Carte' OR m.typemedia='Graphique') AND (th.idtheme=0 OR th.idtheme=1)
    Ce qui fonctionne parfaitement et me retourne les résultats attendu


    Le problème se situe au niveau des idtheme

    Le principe est que dans un applet Java, l'utilisateur définit un arbre booléen sur les thèmes, avec en feuille ces fameux th.idthemes=x, x un nombre.

    Disons par exemple
    (NOT (th.idthemes=0 OR th.idthemes=1) AND (th.idthemes=2 AND (th.idthemes=3 OR th.idthemes=4)))
    Je ne sais pas si l'exemple est parfaitement juste, je pense que oui, enfin l'idée est la ...

    Ce que je veux évidemment, c'est récupérer la liste des medias qui disposent des themes comme l'utilisateur a fait son arbre juste avant. Quand ce sont que des OR et que c'est bien linéaire, ok, mais deja rien qu'un AND entre deux thèmes ne me ressort plus rien

    SELECT DISTINCT m.idmedia,m.titre,m.url,m.typemedia,l.codeinsee,l.echelle FROM geopos_media m LEFT OUTER JOIN geopos_localisation l ON m.idmedia=l.idmedia LEFT OUTER JOIN geopos_themes th ON m.idmedia=th.idmedia LEFT OUTER JOIN geopos_descr des ON m.idmedia=des.idmedia WHERE (m.typemedia='Texte' OR m.typemedia='Statistiques' OR m.typemedia='Carte' OR m.typemedia='Graphique') AND (th.idtheme=0 AND th.idtheme=1)
    Je vois pourquoi, mais je ne vois pas du tout comment corriger mon erreur

    Je résume donc, le but c'est de trouver les documents (idmedia de la table media) qui disposent ou non suivant les choix des utilisateurs des idthemes.

    d'un point de vue simple idtheme=0 AND idtheme=1 dans un premier temps

    mais surtout des trucs du genre idtheme=0 AND (idtheme=2 OR idtheme=1)

    La je suis complètement perdu, je sais meme pas ou aller ! Merci pour votre aide

    edit : je précise que je vois bien qu'il ne faut pas faire une jointure, mais quoi faire exactement je ne sais pas, et je travaille avec postgresql, mais je ne pense pas que ca soit important.

  2. #2
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut Re: [SQL] récupérer la liste de mes thèmes issus arbre boolé
    Citation Envoyé par guipom
    Je résume donc, le but c'est de trouver les documents (idmedia de la table media) qui disposent ou non suivant les choix des utilisateurs des idthemes.

    d'un point de vue simple idtheme=0 AND idtheme=1 dans un premier temps
    Ton souci c'est de confondre ce que tu veux et la structure de la base. D'un point de la structure, idtheme est une colonne qui ne peut avoir par ligne qu'une seule et unique valeur. Autrement dit le test (idtheme=0 AND idtheme=1 ) ne sera jamais vrai (à moins de dénormaliser, ce qui n'est pas souhaitables, et d'avoir 2 colonnes idtheme voire plus).

    Il faut donc que tu comptes le nombre de lignes ayant idtheme=0 et le nombre de ligne ayant idtheme=1. Après il faut l'associer éventuellement avec des OR.

    Ce n'est donc pas qu'une logique booléenne horizontale (par ligne) mais aussi verticale (pour la même colonne). Il faut repenser ta requête en fonction de cela.

    Inspires aussi toi de cette réponse là.
    http://www.developpez.net/forums/viewtopic.php?t=314505 (mardi 22 mars, 2005 16:28 )

  3. #3
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Si j'ai bien compris tu cherches les IdMedia qui possèdent un certain nombre de thèmes et ne possèdent pas un certain nombre d'autres thèmes , je pense que tu vas être contraint de générer dynamiquement ta requête sur le modèle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT IdMedia FROM GEOPOS_MEDIA a
    WHERE NOT EXISTS (SELECT NULL FROM GEOPOS_THEME b WHERE a.IdMedia = b.IdMedia AND (b.IdTHeme = 0 OR b.IdTheme = 1))
      AND     EXISTS (SELECT NULL FROM GEOPOS_THEME b WHERE a.IdMedia = b.IdMedia AND b.IdTHeme = 2)
      AND     EXISTS (SELECT NULL FROM GEOPOS_THEME b WHERE a.IdMedia = b.IdMedia AND (b.IdTHeme = 3 OR b.IdTheme = 4))
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  4. #4
    Membre habitué
    Avatar de guipom
    Inscrit en
    Janvier 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 207
    Points : 184
    Points
    184
    Par défaut
    la partie dynamique n'est pas génante car la requete est construire dans un script php, merci pour vos réponses, je ne marque pas le sujet comme résolu pour l'instant, le temps de tester, je suis sur que j'aurai d'autres questions

  5. #5
    Membre habitué
    Avatar de guipom
    Inscrit en
    Janvier 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 207
    Points : 184
    Points
    184
    Par défaut
    Citation Envoyé par pgibone
    Si j'ai bien compris tu cherches les IdMedia qui possèdent un certain nombre de thèmes et ne possèdent pas un certain nombre d'autres thèmes , je pense que tu vas être contraint de générer dynamiquement ta requête sur le modèle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT IdMedia FROM GEOPOS_MEDIA a
    WHERE NOT EXISTS (SELECT NULL FROM GEOPOS_THEME b WHERE a.IdMedia = b.IdMedia AND (b.IdTHeme = 0 OR b.IdTheme = 1))
      AND     EXISTS (SELECT NULL FROM GEOPOS_THEME b WHERE a.IdMedia = b.IdMedia AND b.IdTHeme = 2)
      AND     EXISTS (SELECT NULL FROM GEOPOS_THEME b WHERE a.IdMedia = b.IdMedia AND (b.IdTHeme = 3 OR b.IdTheme = 4))
    bon alors après une petite digestion de tout ca, ca semble etre (plus ou moins) la réponse à mon problème.

    Toutefois comme ce n'est pas bien clair, je préfère demander une petite précision

    Dans ton exemple, a quelle équivalent booléen correpond ta requête ?

    Si tu pouvais par exemple me transformer ceci :

    idmedia = 0 OR ((idmedia = 1 OR idmedia=2) AND (idmedia = 3 AND idmedia = 4)) en une requete SQL, je pense que je pourrais comprendre comment ca marche ....

    surtout comment systématiser un ET et un OU dans mon cas ... après je me débrouille pour créer un algo qui s'occupe de générer la bonne requete

  6. #6
    Membre habitué
    Avatar de guipom
    Inscrit en
    Janvier 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 207
    Points : 184
    Points
    184
    Par défaut
    bon en fait j'ai trouvé, il faut quitter le monde SQL et passer au notation ensembliste pour s'y retrouver

    alors un AND c'est un INTERSECT, un OR un UNION, et un != un MINUS

    et avec ca, normalement c'est bon

  7. #7
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par guipom
    Si tu pouvais par exemple me transformer ceci :
    idmedia = 0 OR ((idmedia = 1 OR idmedia=2) AND (idmedia = 3 AND idmedia = 4)) en une requete SQL, je pense que je pourrais comprendre comment ca marche ....
    Mon exemple correspond au tien :
    (NOT (th.idthemes=0 OR th.idthemes=1) AND (th.idthemes=2 AND (th.idthemes=3 OR th.idthemes=4)))
    La solution ensembliste devrait convenir aussi, mais elle est toujours dans le monde SQL () et si j'étais toi, je ferais des tests de performance (si la table est petite, pas de problème).
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  8. #8
    Membre habitué
    Avatar de guipom
    Inscrit en
    Janvier 2003
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 207
    Points : 184
    Points
    184
    Par défaut
    oui évidemment les notions ensemblistes sont toujours dans le monde SQL, je voulais dire par la qu'on voyait mieux la solution en parlant d'ensembles

    Sinon oui les tests de performances seront à prévoir, en effet ca peut être couteux vu que la table aura dans les 1000 enregistrements

    Merci pour ton aide en tous cas, je comparerai les deux solutions

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/10/2008, 14h49
  2. [SQL] Récupérer des variables d'une liste déroulante
    Par jermel2 dans le forum PHP & Base de données
    Réponses: 28
    Dernier message: 25/06/2007, 18h21
  3. [SQL] récupérer sélection dans liste déroulante
    Par nerick dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 06/12/2005, 11h30
  4. [C#] [SQL Server] Récupérer la liste des bases d'un serveur.
    Par exe dans le forum Accès aux données
    Réponses: 2
    Dernier message: 05/08/2004, 17h40

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