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 :

Requête SELECT WHERE IN ensemble [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 4
    Par défaut Requête SELECT WHERE IN ensemble
    Bonjour,

    J'essaie de faire une requête sur une table de la manière suivante:

    J'ai une table 'usersmovies' avec en colonne 'username' et 'movie_title'.

    Je veux sélectionner les 'username' qui ont au moins un 'movie_title' en commun, j'utilise donc une requête du type:

    SELECT username FROM usersmovies WHERE movie_title IN ?

    Le point d'interrogation est censé être un ensemble dans lequel chercher, un ensemble du type ('élément 1', 'élément 2') sauf que dans mon cas je veux qu'il soit variable et qu'il soit donc un tableau/une liste.

    Le problème c'est que je n'arrive pas à sélectionner les 'username' en utilisant le code source suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?php
    session_start();
     
    //Connexion à la BDD:
    try
    {
    $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
    }
    catch(Exception $e)
    {
    die('Erreur : '.$e->getMessage());
    }
     
    //Requête pour sélectionner tous les films de l'utilisateur de la session:
    $usermovies = $bdd->prepare('SELECT movie_title FROM usersmovies WHERE username = ?');
    $usermovies->execute(array($_SESSION['username']));
     
    while($donnees = $usermovies->fetch())
    {
        echo $donnees['movie_title'];
        $movies[]=$donnees['movie_title'];
    }
     
    //Requête pour sélectionner les utilisateurs ayant au moins un film en commun avec l'utilisateur de la session:
    $test = $bdd->prepare('SELECT username FROM usersmovies WHERE movie_title IN ?');
    $test->execute(array($movies));
     
    while($commonmovies = $test->fetch())
    {  
    echo $commonmovies['username'];
    }
     
    ?>
    Il me renvoie: "Notice: Array to string conversion in /Users/ganeshmamodaly/Sites/entourage.php on line 26"

    Et si je remplace (en ligne 26)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $test->execute(array($movies));
    par (crochets en plus)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $test->execute(array($movies[]));
    il me renvoie:

    "Fatal error: Cannot use [] for reading in /Users/ganeshmamodaly/Sites/entourage.php on line 27"

    Du coup je n'arrive pas à sélectionner tous les utilisateurs ayant au moins un film en commun avec l'utilisateur de la session

    Quelqu'un aurait-il une idée pour pouvoir faire cette manip?

    Je ne sais pas si j'ai été assez clair

    Merci beaucoup de votre aide!

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonsoir,

    Quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT username FROM usersmovies WHERE movie_title IN (SELECT movie_title FROM usermovies WHERE username = :currentuser)"
    Dans tous les cas il serait préférable de faire une auto-jointure car le IN est séquentiel donc très lent.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 4
    Par défaut
    Du génie!!

    Je n'avais pas pensé à faire comme ça, on voit bien que je débute!

    J'ai remplacé mon code par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <?php
    session_start();
     
    //Connexion à la BDD:
    try
    {
    $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
    }
    catch(Exception $e)
    {
    die('Erreur : '.$e->getMessage());
    }
     
    //Requête pour sélectionner tous les films de l'utilisateur de la session:
    $usermovies = $bdd->prepare('SELECT movie_title FROM usersmovies WHERE username = ?');
    $usermovies->execute(array($_SESSION['username']));
     
    while($donnees = $usermovies->fetch())
    {
        echo $donnees['movie_title'];
    }
     
    //Requête pour sélectionner les utilisateurs ayant au moins un film en commun avec l'utilisateur de la session:
    $test = $bdd->prepare('SELECT username FROM usersmovies WHERE movie_title IN (SELECT movie_title FROM usersmovies WHERE username = ?)');
    $test->execute(array($_SESSION['username']));
     
    while($commonmovies = $test->fetch())
    {  
    echo $commonmovies['username'];
    }
     
    ?>
    Et ça marche

    Merci beaucoup rawsrc!!!

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

Discussions similaires

  1. [AC-2003] Requête :SELECT WHERE TABLE1_champ1 LIKE *TABLE2champ2*
    Par mitinou dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 15/04/2011, 10h26
  2. SELECT WHERE IN ensemble de valeurs
    Par Nono23 dans le forum SQL
    Réponses: 1
    Dernier message: 06/10/2010, 16h55
  3. [MySQL] Erreur sur une requête select where
    Par Goffer dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 04/01/2009, 08h45
  4. Requête select where
    Par comrad85 dans le forum SQL
    Réponses: 16
    Dernier message: 31/10/2008, 00h12
  5. PB sur requête SELECT WHERE SELECT
    Par aliochai dans le forum Requêtes
    Réponses: 2
    Dernier message: 03/03/2008, 15h59

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