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

Requêtes MySQL Discussion :

sql un peu farfelue


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Points : 2
    Points
    2
    Par défaut sql un peu farfelue
    Bonjour,

    et désolé si j'ai mal cherché...

    J'ai 3 tables

    utilisateurs

    id_user | pseudo | sexe |
    ---------+---------+------+
    1 | toto | 1 |
    2 | tata | 2 |
    3 | lui | 1 |
    4 | elle | 2 |

    useronline (donc qui liste les utilisateurs en ligne)

    id_user | temps |

    et une table user_amis (qui gére les amis et ennemis)

    id_user | id_ami | etat |
    -----------+--------+-----+
    1 | 2 | 1 | donc 2 est l'amie de 1
    1 | 3 | 2 | donc 3 est l'ennemi de 1
    4 | 1 | 2 | donc 1 est lennemi de 4

    admettons que tout le monde est online et que je sois 1

    je voudrais récupérer tous les utilisateurs online (autre que moi) dont je ne suis pas l'ennemi et dont le sexe est l'opposé du mien (donc 2)

    j'ai essayé ceci :

    SELECT u.id_user, u.pseudo
    FROM useronline as o
    INNER JOIN utilisateur as u ON o.id_user=u.id_user
    LEFT JOIN user_amis as a ON u.id_user=a.id_user
    WHERE (u.id_user<>1 AND u.sexe=2)
    AND NOT (a.etat=2 AND a.id_ami=1)

    mais cela ne me renvoie plus rien
    j'ai alors essayé ceci

    SELECT DISTINCT u.id_user, u.pseudo
    FROM useronline as o
    INNER JOIN utilisateur as u ON o.id_user=u.id_user
    WHERE (u.id_user<>1 AND u.sexe=2)
    AND u.id_user NOT IN (SELECT DISTINCT a.id_user FROM user_amis as a WHERE a.etat=2 AND a.id_ami=1)

    là j'ai une erreur 1064 : erreur de syntaxe près de....

    Donc je suis perdu...
    Alors avant de perdre le peu de cheveux qui me restent, merci de m'envoyer vos idées, remarques, critiques, insultes, .....

    Martial

  2. #2
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut
    Bonjour,

    Quel est le message exacte de l'erreur?
    Pensez au tag

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    bon

    le message d'erreur est :

    erreur d'execution SQL(1064). Reponse de la nase de données:
    erreur de syntaxe près de 'SELECT DISTINCT a.id_user FROM user_amis as A WHERE a.etat=2 AND' à la ligne 3

    Je suis pas sur que ça va t'aider mais bon....

    donc laissons tomber le message d'erreur....

    j'ai transformé ma requete comme suit

    SELECT u.id_user, u.pseudo
    FROM useronline as o
    INNER JOIN utilisateur as u ON o.id_user=u.id_user
    LEFT JOIN user_amis as a ON u.id_user=a.id_user
    WHERE (u.id_user<>1 AND u.sexe=2)
    AND (NOT (a.etat=2 AND a.id_ami=1) OR a.etat IS NULL)

    car à prioris, du moment ou je met a.etat = 2 il me dégage les NULL

    donc ça marche...presque....

    Cette fois ci j'ai bien les utilisateurs online pour lesquels je suis pas ennemi.....sauf....sauf ceux qui ont d'autre ennemi...
    Et c'est bien là le problème

    C'est pour cela que je voulais utiliser un NOT IN avec une sous-requete

  4. #4
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut
    sauf que selon le message d'erreur, le serveur MySQL ne gère pas les sous requetes. Une solution peut être de remplacer la sous-requete par un LEFT OUTER JOIN ayant pour condition la clause where de la sous requete.
    Pensez au tag

  5. #5
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    heu, oui

    mais sachant que je suis une vraie b.... en sql

    Ca donnerait quoi avec ce LEFT OUTER JOIN ????

    merci

  6. #6
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut
    En partant de ta première version,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT DISTINCT u.id_user, u.pseudo
     FROM useronline as o
              INNER JOIN utilisateur as u ON o.id_user=u.id_user
              LEFT OUTER JOIN user_amis as a
                      ON (a.etat=2 AND a.id_ami=1 AND u.id_user=a.id_user)
    WHERE (u.id_user<>1 AND u.sexe=2) AND ISNULL(a.id_user)
    Enfin, je crois...
    Pensez au tag

  7. #7
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    ben en voilà une solution qu'a l'air bonne

    Je suis en train de tester et à prioris ça semble tourner...
    Bon faut encore que je teste les amis des amis des ennemis des amis...

    Mais bon....On dirait que je vais peut être garder quelques cheveux sur la tête.

    Je teste, donc et je te tiens au courant...

    Enorme Merci

  8. #8
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bon désolé, je rectifie

    la requete est bonne pour ce cas prècis.

    par contre si je supprime la notion de online, on que j'ajoute d'autres clauses au where ça ne marche plus... c'est à dire que ça me retourne quand meme ceux pour qui je suis ennemi

    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT DISTINCT u.id_user, u.pseudo 
     FROM utilisateur as u 
              LEFT OUTER JOIN user_amis as a 
                      ON (a.etat=2 AND a.id_ami=1 AND u.id_user=a.id_user) 
    WHERE (u.id_user<>1 AND u.sexe=2) AND ISNULL(a.id_user)
    me retourne meme ceux pour qui etat=2 et id_ami=1

    ???

  9. #9
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut
    C'est quoi les clauses ajoutées au where?
    Pensez au tag

  10. #10
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 6
    Points : 2
    Points
    2
    Par défaut resolu
    Cher Adjanakis

    avant tout je tiens à te remercier de l'attention que tu as porté à mon problème...

    Pour simplifier et contourner l'inexistance du NOT IN dans la version de MYSQL offerte par mon hébergeur, j'ai opté pour une autre approche du problème.

    j'ai donc dans un premier temps crée une sql qui me retourne la liste des ennemis (en fait c'est une liste noire)

    donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT id_user FROM user_amis
    WHERE id_amis = $monid
    AND etat =2
    j'ecris en PHP le résultat de cette requete sous la forme

    $blacklist = ' AND u.ID_USER NOT IN ( suite du resulat séparé par une virgule ) ';

    exemple :

    $blacklist = 'AND u.id_user NOT IN (3, 6, 10, 54) ';
    ou $blacklist =' ' s'il n'y a pas de résultat

    ensuite il ne me reste plus qu'a reprendre ma requete d'origine

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $sql = 'SELECT DISTINCT u.id_user, u.pseudo ';
    $sql.= 'FROM useronline as o ';
    $sql.='INNER JOIN utilisateur as u ON o.id_user=u.id_user  '; 
    $sql.= 'WHERE (u.id_user<>1 AND u.sexe=2) ';
    $sql.= $blacklist ;
    mon $sql.= blacklist peut être ajouté à n'importe laquelle de mes requetes

    mon problème est donc résolu à moins qu'il n'existe une solution plus simple...

    Merci a bientot

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

Discussions similaires

  1. [AC-2007] SQL : Trop peu de paramètres
    Par oOXimOo dans le forum VBA Access
    Réponses: 3
    Dernier message: 17/06/2010, 22h34
  2. requête sql un peu complexe
    Par new_wave dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/08/2007, 14h41
  3. erreur requète SQL : trop peu de paramètres
    Par pierre.egaud dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 21/04/2006, 14h57
  4. requête SQL un peu casse tête
    Par hellbilly dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/12/2005, 10h03
  5. requette sql un peu tordue
    Par maxidoove dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/08/2005, 14h52

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