Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/01/2008, 14h00   #1
Futur Membre du Club
 
Inscription : avril 2007
Messages : 51
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 51
Points : 15
Points : 15
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 :
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!
frakosun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2008, 14h57   #2
Membre Expert
 
Avatar de alain.couthures
 
Inscription : avril 2007
Messages : 889
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : avril 2007
Messages : 889
Points : 1 061
Points : 1 061
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/
alain.couthures est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2008, 15h44   #3
Membre éclairé
 
Homme Damien Attanasio
Développeur informatique
Inscription : février 2007
Messages : 340
Détails du profil
Informations personnelles :
Nom : Homme Damien Attanasio
Localisation : France, Hérault (Languedoc Roussillon)

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

Informations forums :
Inscription : février 2007
Messages : 340
Points : 307
Points : 307
Je n'ai pas trop bien compris ton problème.

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

Code :
votes.uid = $uid IS NULL
madevilts est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2008, 15h52   #4
Futur Membre du Club
 
Inscription : avril 2007
Messages : 51
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 51
Points : 15
Points : 15
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
frakosun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2008, 16h19   #5
Membre éclairé
 
Homme Damien Attanasio
Développeur informatique
Inscription : février 2007
Messages : 340
Détails du profil
Informations personnelles :
Nom : Homme Damien Attanasio
Localisation : France, Hérault (Languedoc Roussillon)

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

Informations forums :
Inscription : février 2007
Messages : 340
Points : 307
Points : 307
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 :
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
madevilts est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2008, 18h11   #6
Futur Membre du Club
 
Inscription : avril 2007
Messages : 51
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 51
Points : 15
Points : 15
merci mais ta requete ne retourne aucun résultat.. :/

je ne comprend pas là.
frakosun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 08h15   #7
Membre éclairé
 
Homme Damien Attanasio
Développeur informatique
Inscription : février 2007
Messages : 340
Détails du profil
Informations personnelles :
Nom : Homme Damien Attanasio
Localisation : France, Hérault (Languedoc Roussillon)

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

Informations forums :
Inscription : février 2007
Messages : 340
Points : 307
Points : 307
C'est fort possible.

Commence par faire

Code :
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.
madevilts est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 19h59   #8
Futur Membre du Club
 
Inscription : avril 2007
Messages : 51
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 51
Points : 15
Points : 15
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à
frakosun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2008, 10h18   #9
Membre éclairé
 
Homme Damien Attanasio
Développeur informatique
Inscription : février 2007
Messages : 340
Détails du profil
Informations personnelles :
Nom : Homme Damien Attanasio
Localisation : France, Hérault (Languedoc Roussillon)

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

Informations forums :
Inscription : février 2007
Messages : 340
Points : 307
Points : 307
tente avec

madevilts est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2008, 12h33   #10
Futur Membre du Club
 
Inscription : avril 2007
Messages : 51
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 51
Points : 15
Points : 15
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
frakosun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2008, 13h08   #11
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
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 :
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 SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2008, 15h03   #12
Futur Membre du Club
 
Inscription : avril 2007
Messages : 51
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 51
Points : 15
Points : 15
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!
frakosun est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h59.


 
 
 
 
Partenaires

Hébergement Web