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

PHP & Base de données Discussion :

[SQL] Double requête avec jointure


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club Avatar de frakosun
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 38
    Points
    38
    Par défaut [SQL] Double requête avec jointure
    Bonjour à tous,

    voilà, j'en appelle à vos lumières pour m'aider sur une requete sql, parce que la je sèche.

    En gros j'ai un système de gestion d'articles avec 2 tables :
    - l'une avec les articles et plusieurs champs dont un "statut" (à 1 pour validé, 0 pour non validé) et id_membre
    - une autre avec les votes, plusieurs champs ont l'id membre du vote et l'id de l'article

    le concept est que pour etre publié un article doit avoir une moyenne de 5/10 sur 3 votes de membres. Tout se met à jour parfaitement via le script php, mais j'ai un problème pour personnaliser la liste des articles non évalués par membre.

    En fait je voudrais pouvoir lister les articles en attente de validation pour lequel le membre n'est pas l'auteur et n'a pas encore voté. (c'est la partie soulignée qui cloche)

    voici la requête que je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * FROM articles 
    LEFT OUTER JOIN votes ON articles.id = votes.aid 
    WHERE articles.status = 0 
    AND articles.added_uid <> $uid 
    AND votes.uid = $uid IS NULL 
    ORDER BY articles.date_ajout DESC
    c'est le code en rose qui est mauvais...

    merci d'avance à ceux qui pourront m'aider!

  2. #2
    Membre éprouvé Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Points : 1 247
    Points
    1 247
    Par défaut
    Il faut utiliser dans le WHERE un "AND NOT(EXIST(SELECT ...))"
    Formulaires XForms sur tous navigateurs sans extension à installer (architecture XRX) : http://www.agencexml.com/xsltforms/

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2007
    Messages : 340
    Points : 350
    Points
    350
    Par défaut
    Je n'ai pas trop bien compris ton problème.

    il faut que votes.uid soit différent de $uid, c'est ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    votes.uid = $uid IS NULL

  4. #4
    Nouveau membre du Club Avatar de frakosun
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 38
    Points
    38
    Par défaut
    Merci pour vos réponses!

    en fait que je procède de cette façon il prend en compte l'intégralité des articles non-validés, je n'arrive pas à soustraires ceux pour lesquels un membre n'a pas voté :/

    edit pour madevilts> Oui mais pas exactement, et c'est pour celà que ma requete ne foncionne pas.


    En gros pour simplifier imagine qu'il ya 10 articles en attente de validation dans la base. le membre A en a déjà validé 5 en votant, donc je voudrais faire la requete qui puisse afficher les 5 restant qu'il lui reste à valider.

    Donc je fais une 1ere requete pour trouver les articles en attente de validation et dont le membre n'est pas l'auteur. Et dans ma 2ème requete je voudrais enlever de la liste les articles déjà validés mais ça coin....
    à mon avis c'est la méthodoligie qui est foireuse .

    merci

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2007
    Messages : 340
    Points : 350
    Points
    350
    Par défaut
    Alors je pense qu'il te faut faire la liste des article qui ne sont ni voté ni créé donc je pense que ça doit etre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * FROM articles
    LEFT JOIN votes ON articles.id = votes.aid //On lie les articles avec leurs votes s'il y en a
    WHERE articles.added_uid <> $uid //On enlève les articles qui ont été créés par l'utilisateur courant
    AND votes.uid <> $uid //On enlève les articles qui ont été déjà votés par l'utilisateur
    AND articles.statut = 0 //On ne garde que les articles qui n'ont pas été validés

  6. #6
    Nouveau membre du Club Avatar de frakosun
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 38
    Points
    38
    Par défaut
    merci mais ta requete ne retourne aucun résultat.. :/

    je ne comprend pas là.

  7. #7
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2007
    Messages : 340
    Points : 350
    Points
    350
    Par défaut
    C'est fort possible.

    Commence par faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM articles
    LEFT JOIN votes ON articles.id = votes.aid
    Ceci doit te retourner tous les enregistrements qu'ils soient votés ou non et qu'ils soient validés ou non. Si tu n'as qu'une partie des non votés c'est que la jointure n'est pas bonne.

  8. #8
    Nouveau membre du Club Avatar de frakosun
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 38
    Points
    38
    Par défaut
    ok, ca y est, ca me donne le total des enregistrements d'articles (valides ou non)

    ensuite si je rajoute la ligne suivante, j'obtient la liste des articles (valides ou nons) dont le membre n'est pas l'auteur

    Par contre sit je rajoute le AND qui suit la requete me liste les articles que le membre a voté...
    le soucis provient de là

  9. #9
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2007
    Messages : 340
    Points : 350
    Points
    350
    Par défaut
    tente avec


  10. #10
    Nouveau membre du Club Avatar de frakosun
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 38
    Points
    38
    Par défaut
    merci!

    ca me produit le même résultat que ma requete d'origine, à savoir:
    Liste de tous les articles en attente de validation (non postés par membre) - articles pour lesquels un vote a été enregistré (peu importe le membre)

    En gros si j'ai 100 articles en attente, que le membre A a voté 5 fois, le membre B 5 fois et le membre C 0 fois j'aurais pour tous les membres 90 articles en attente (100 -(5+5))...

    au lieu de 95 pour les membres A & B et 100 pour le membre C

  11. #11
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Si j'ai bien compris (mais c'est loin d'être sûr), ton problème est d'exclure les votes du membre $uid ?
    Dans ce cas, il faudrait mettre la condition <> $uid dans le LEFT JOIN :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * 
    FROM articles A
      LEFT OUTER JOIN votes V ON A.id = V.aid AND V.uid <> $uid  -- ignore les votes de $uid
    WHERE A.status = 0 
      AND V.aid IS NULL -- détecte les lignes repêchées par le LEFT JOIN
    ORDER BY A.date_ajout DESC
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  12. #12
    Nouveau membre du Club Avatar de frakosun
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 38
    Points
    38
    Par défaut
    Eureka!! Merci Antoun c'est ça!

    Ce sont mes conditions de jointure qui étaient mauvaises en fait, et je n'aurais jamais pensé à ça, merci beaucoup!

    Par contre j'ai changé un petit détail pour que ça fonctionne:
    en
    Encore merci à toi, madevilts et alain pour votre aide!

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

Discussions similaires

  1. Requête sql multi-source avec jointure en pur VBA dans excel
    Par guidav dans le forum Général VBA
    Réponses: 1
    Dernier message: 21/09/2013, 20h33
  2. Optimisation requête avec jointure externe SQL Server
    Par ICEMAN_60 dans le forum Développement
    Réponses: 2
    Dernier message: 28/11/2011, 10h08
  3. [SQL 2000] Optimisation requête avec jointure multiple
    Par zooffy dans le forum Développement
    Réponses: 5
    Dernier message: 18/09/2007, 15h38
  4. [SQL 2000] Optimisation requête avec jointure multiple
    Par zooffy dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 18/09/2007, 15h38
  5. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33

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