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 :

Chercher dans une table selon le résultat d'une autre


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 103
    Points : 46
    Points
    46
    Par défaut Chercher dans une table selon le résultat d'une autre
    Désolé pour ce titre un peu abracadabrantesque....

    Voilà mon problème:
    J'ai une table (films) contenant des champs, dont un Id.
    Dans une autre table (notes), j'ai 3 champs: film, user, note

    Le principe c'est que des users mettent des notes à des films mais peu importe.

    Je voudrais pouvoir selectionner tout les films dont la moyenne des notes est comprise entre x et y.

    Pour l'instant je n'ai trouvé qu'un moyen c'est de passer en deux phases:
    1- je récupère tous les ID des films dans un tableau $id
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $req = mysql_query("SELECT Id FROM films");
    while($data = mysql_fetch_assoc($req)) {
    $id[] = $data['Id'] ;
    }
    2- je fais une boucle (en php):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach($id as $key => $film) {
    $moyenne = mysql_query("SELECT AVG(note) FROM notes WHERE film='$film'"); 
    $moyenne = round(mysql_result($moyenne,0),2);
    if ($moyenne >=6 AND $moyenne <=7) echo "Film ID: $idfilm - Moyenne: $moyenne<br>";
    }
    Ici j'affiche donc les films dont la note est comprise entre 6 et 7.

    J'aimerais savoir si il existe un moyen de faire ça en une seule phase, avec un code qui ressemblerait à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * from films WHERE "la moyenne des notes dans la table notes pour un id unique est comprise entre x et y"

    Solution possible, je rajoute un champ "moyenne des notes" dans la table films, et là la recherche devient galette, mais ça m'oblige à l'updater souvent ce qui n'est pas forcément mieux.

    Any idea?
    Merci.

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Bonjour,

    Tu peux effectivement le faire en une seule requête. La fonction d'agrégation AVG est faite pour ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select film, avg(note) as moyenne
    from notes
    group by film
    having moyenne between 6 and 7
    Au besoin, si c'est le nom du film que tu veux, tu peux faire une jointure sur la table des films via l'id pour récupérer le nom.

    ced

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 103
    Points : 46
    Points
    46
    Par défaut
    Ca marche impec.
    Je comprends pas trop comment, je vais voir les docs pour comprendre le fonctionnement de la fonction d'agrégation.

    Merci beaucoup Ced

    Et pour la jointure, j'aimerais bien savoir, même si j'en ai pas besoin...

    Edit: et en fait, bien sur, j'en ai besoin... et j'y arrive pas :/

    edit2: c'est bon, avec quelques sueurs

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Avec la jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT f.nom_film, avg(n.note) AS moyenne
    FROM notes n
    INNER JOIN film f ON n.film = f.id
    GROUP BY f.nom_film
    HAVING moyenne BETWEEN 6 AND 7
    Et le lien vers la documentation MySQL sur les fonctions d'agrégation : ici .

    Si tout fonctionne bien, n'oublie pas de passer le message en "Résolu" .

    ced

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 103
    Points : 46
    Points
    46
    Par défaut
    J'avais "inventé" ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT films.*,film, avg(note) AS moyenne 
    FROM films,notes
    WHERE films.Id = notes.film
    GROUP BY film 
    HAVING moyenne BETWEEN 6 AND 7
    Qui fonctionne aussi.
    Mais j'ai vu passer le INNER JOIN en effet sur les docs... plus efficace ?

    Merci pour le lien

  6. #6
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Citation Envoyé par AIexis Voir le message
    J'avais "inventé" ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT films.*,film, avg(note) AS moyenne 
    FROM films,notes
    WHERE films.Id = notes.film
    GROUP BY film 
    HAVING moyenne BETWEEN 6 AND 7
    Qui fonctionne aussi.
    Mais j'ai vu passer le INNER JOIN en effet sur les docs... plus efficace ?
    Ton code fonctionne aussi et fait une jointure interne, mais avec l'écriture de la première norme SQL (condition de jointure dans la clause WHERE et tables séparées par une virgule).
    La syntaxe avec INNER JOIN est plus récente, plus lisible et permet de distinguer ce qui correspond à la jointure de ce qui correspond aux conditions de filtrage dans le WHERE. C'est plus propre, et avec des requêtes compliquées, ça optimise les traitements.

    ced

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 103
    Points : 46
    Points
    46
    Par défaut
    Ok, merci

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

Discussions similaires

  1. MAJ Champs d'une table selon sa valeur et une table de correspondance
    Par eduardo9231 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 26/06/2012, 10h53
  2. Mise à jour d'une table à partir du résultat d'une requête
    Par zoharcryss dans le forum Langage SQL
    Réponses: 12
    Dernier message: 18/08/2009, 15h33
  3. Réponses: 7
    Dernier message: 20/08/2008, 14h26
  4. Remplir une table avec le résultat d'une instruction SQL
    Par jbeu dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/09/2007, 23h49
  5. Réponses: 8
    Dernier message: 11/08/2006, 09h30

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