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

PostgreSQL Discussion :

petit problème de requete


Sujet :

PostgreSQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 70
    Points : 30
    Points
    30
    Par défaut petit problème de requete
    Bonjour a tous,

    Dans le but de réussir mon année, j'ai un projet a faire en php, qui "discute" avec une db postgre.

    Mon probleme est que j'ai une requete qui déconne...

    Je refais un site genre eBay (rien de commercial pour moi bien sur), Vous connaissez +/- le principe pour les évaluations :

    une éval vient d'un user pour un user en fonction d'un objet.

    Donc moi j'aimerais bien afficher les objets (pour l'utilisateur en cours) auquels il reste encore une évaluation a mettre. Ce qui veut donc dire que soit il est le vendeur, soit il est l'acheteur.

    Voici la requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select urlimage,nom,getprixactuel,ov.id_objet from projet.objetsvendus ov,projet.evaluations ev where (ov.id_user = $_SESSION[monUser] OR ov.dernierencherisseur=$_SESSION[monUser]) and ev.id_objet<>ov.id_objet
    obetsvendus est une vue definie comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT objet.id_objet, objet.id_categorie, objet.id_user, objet.id_type, objet.nom, objet.description, objet.prix_depart, objet.prix_reserve, objet.prix_achat_immediat, objet.enchere_min, objet.date_mev, objet.duree, objet.urlimage, gettempsrestant(objet.id_objet) AS gettempsrestant, getprixactuel(objet.id_objet) AS getprixactuel, getdernierencherisseurid(objet.id_objet) AS dernierencherisseur
       FROM objet
      WHERE objet.id_user = utilisateurs.id_user AND gettempsrestant(objet.id_objet) < '00:00:00'::interval;
    Je vois tres bien que ca ne saurait pas fonctionner convenablement, le résultat que j'en recois est qu'il m'affiche les évaluations qu'il reste a mettre (ok) mais aussi ceux pour lesquels il y en a dejé une (pas ok)

    Alors comme je suis pas fort du tout la dedans, je prefere demander conseil a plus malin que moi

    Voila je présente mon projet lundi, j'espere avoir des réponses rapidement.

    Si j'ai pas bien expliqué ou qu'il manque des infos, n'hésitez pas

    Merci d'avance

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 70
    Points : 30
    Points
    30
    Par défaut
    vu 14fois et no response



  3. #3
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    Les 14 personnes (15 avec moi) qui ont lu ta question ont dû être un peu découragées par le fait que tu ne donnais pas le schéma de tes bases, aucun exemple, et que donc elles devaient tout deviner en décortiquant les requêtes... Il faut se mettre un peu à leur place.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 70
    Points : 30
    Points
    30
    Par défaut
    Oui c'est vrai, c'est du langage de sourd... Moi je sais tres bien de quoi je parle mais je n'ai pas pensé qu'il fallait decortiquer le bazar

    Voici donc les infos requises pour comprendre :

    ma table objet :



    ma table d'évaluation :



    la requete utilisée pour l'exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select urlimage,nom,getprixactuel,ov.id_objet,ov.id_user,ev.id_user,ev.id_user_concerne from projet.objetsvendus ov,projet.evaluations ev where (ov.id_user = 2 OR ov.dernierencherisseur=2) and ev.id_objet<>ov.id_objet
    le resultat de l'exemple :



    Il faut donc que je recupere les objets pour lesquels il n'y a pas encore eu d'évaluation.
    Donc a mon sens, il faut que les id_obets concordent, que le user concerné soit soit le vendeur, soit l'acheteur et enfin qu'il n'ait pas encore mis une éval pour cet objet...

    Seulement j'y arrive pas et je tourne en rond

    Merci d'avance

  5. #5
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Le plus simple dans ce cas est de faire une jointure externe entre la vue objetsvendus (plus exactement les objets vendus/enchéris par le vendeur/Acheteur) et la table evaluations, et de ne faire ressortir que les tuples dans lesquels id_eval est à NULL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ne.urlimage,ne.nom,ne.getprixactuel,ne.id_objet FROM ((SELECT * FROM projet.objetsvendus WHERE id_user = $_SESSION[monUser] OR dernierencherisseur=$_SESSION[monUser]) ov LEFT OUTER JOIN projet.evaluations ev USING id_objet) ne WHERE ne.id_eval IS NULL
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 70
    Points : 30
    Points
    30
    Par défaut
    Merci beaucoup, je vais avouer que je suis sidéré par la facilité que tu as a répondre sur un sujet que tu découvres...

    Néanmoins, j'ai une syntaxe error avec ce que tu m'as donné

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Erreur SQL :
    ERROR:  syntax error at or near "id_objet" at character 188
     
    In statement:
    SELECT ne.urlimage,ne.nom,ne.getprixactuel,ne.id_objet FROM ((SELECT * FROM projet.objetsvendus WHERE id_user = 2 OR dernierencherisseur=2) ov LEFT OUTER JOIN projet.evaluations ev USING id_objet) ne WHERE ne.id_eval IS NULL
    J'ai remplacé avec des valeurs pour tester, il me sort ca... Et comme je vais dire que je comprends ce que ca va faire mais que je ne connais pas du tout la syntaxe, je ne sais pas corriger l'erreur

    Encore merci

  7. #7
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Ah désolé, j'ai oublié de mettre les parenthèses autour de id_object :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ne.urlimage,ne.nom,ne.getprixactuel,ne.id_objet FROM ((SELECT * FROM projet.objetsvendus WHERE id_user = $_SESSION[monUser] OR dernierencherisseur=$_SESSION[monUser]) ov LEFT OUTER JOIN projet.evaluations ev USING (id_objet)) ne WHERE ne.id_eval IS NULL
    Citation Envoyé par tyrann
    Merci beaucoup, je vais avouer que je suis sidéré par la facilité que tu as a répondre sur un sujet que tu découvres...
    Quand le problème est bien cerné et que la question est bien posée, généralement la réponse ne pose pas de difficultés...
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 70
    Points : 30
    Points
    30
    Par défaut
    Un grand merci a toi GrandFather

    La requete ne fonctionnait pas exactement comme je voulais, la limitation faite sur sur toute la table empechait le fait que le user ait recu une évaluation mais qu'il n'ait pas encore mis la sienne...

    Autrement dit, j'ai pu modifier (j'ai chipotté ) et voici le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ne.urlimage,ne.nom,ne.getprixactuel,ne.id_objet FROM ((SELECT * FROM projet.objetsvendus WHERE id_user = $_SESSION[monUser] OR dernierencherisseur=$_SESSION[monUser]) ov LEFT OUTER JOIN (SELECT * from projet.evaluations evv where evv.id_user=$_SESSION[monUser]) ev USING (id_objet)) ne WHERE ne.id_eval IS NULL
    Encore un grand

    @++

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

Discussions similaires

  1. petit problème sur une requete
    Par mrdesign38 dans le forum Requêtes
    Réponses: 3
    Dernier message: 02/11/2012, 13h06
  2. Petit problème sur une requete sql
    Par adibou666 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 22/01/2009, 11h57
  3. Réponses: 3
    Dernier message: 15/07/2005, 17h58
  4. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55
  5. Problème de requete multis-selections
    Par tripper.dim dans le forum SQL
    Réponses: 9
    Dernier message: 03/09/2003, 13h08

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