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 :

Select sur 2 tables avec SUM pour une


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : Madagascar

    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Par défaut Select sur 2 tables avec SUM pour une
    Bonjour à tous.
    Voici mon problème.

    J'ai une première table article.
    id_article
    article
    .....
    Une deuxième avec des commentaires et des notes pour l'article.
    id_article
    commentaire
    note
    ......
    Je voudrais pour chaque article compter le nombre de commentaire et additionné les note pour faire une moyen pour afficher.

    article - nombre de commentaire - note moyen.

    Merci d'avance de votre aide.

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Pour compter il faut utiliser COUNT et pour additionner, SUM. Avec un GROUP BY sur les articles, et une jointure entre les tables et une lecture si nécessaire des cours de SQLPro, vous devriez y arriver tout seul.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : Madagascar

    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Pour compter il faut utiliser COUNT et pour additionner, SUM. Avec un GROUP BY sur les articles, et une jointure entre les tables et une lecture si nécessaire des cours de SQLPro, vous devriez y arriver tout seul.
    Merci de votre réponse.
    Cela fonctionne.

    Maintenant une autre question comment optimiser ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT SUM(total_value) / SUM(total_votes), id_places, title, lat, lng, type, address, mg_region, uri, phon1, phon2, fax, categorie, owner_email, description 
    FROM comments c, places p 
    WHERE c.id_places = p.id AND p.approved = 1 AND p.mg_region = '$region' AND p.type = '$type' 
    GROUP BY id_places 
    ORDER BY `order` ASC
    Merci d'avance.

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    1) Les jointures s'écrivent depuis 20 ans avec l'opérateur JOIN. Il serait temps de s'y mettre !

    2) Toutes les colonnes du SELECT ne figurant pas dans une fonction de groupage doivent figurer dans le GROUP BY sous peine de récupérer pour les colonnes absentes des résultats aléatoires.

    3) L'utilisation d'alias rend la requête plus facile à lire et à débuguer. Il est fortement recommandé de les utiliser systématiquement dès qu'une requête emploie plus d'une table.

    4)
    Je voudrais pour chaque article compter le nombre de commentaires et additionner les notes pour faire une moyenne pour afficher.
    Où se trouve l'article dans votre requête ?

    J'ai l'impression que votre requête ne correspond pas au besoin exprimé.

    Donnez la structure complète de vos tables concernées par la requête ainsi qu'un besoin clair.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : Madagascar

    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Par défaut
    Merci de votre patience.
    Voici mes deux tables:

    La table "places" qui contient des établissements.
    Code SQL :
    Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE IF NOT EXISTS
    `places`
    ( `id` int(9) NOT NULL AUTO_INCREMENT,
    `approved`
    int(1) DEFAULT '0',
    `title`
    varchar(100) NOT NULL,
    `type` varchar(20) NOT NULL,
    `lat`
    float NOT NULL,
    `lng`
    float NOT NULL,
    `address` varchar(200) NOT NULL,
    `mg_region` varchar(60) NOT NULL,
    `uri` varchar(200) DEFAULT NULL,
    `description` text NOT NULL,
    `sector`
    varchar(50) DEFAULT NULL,
    `owner_name`
    varchar(100) NOT NULL DEFAULT 'MadaTrotter',
    `owner_email`
    varchar(100) NOT NULL DEFAULT 'marco@madatrotter.com',
    `phon1` varchar(17) NOT NULL,
    `phon2`
    varchar(17) DEFAULT NULL,
    `fax`
    varchar(17) DEFAULT NULL,
    `categorie`
    varchar(15) DEFAULT 'nil',
    `order` int(1) NOT NULL,
    `img` int(1) NOT NULL DEFAULT '0',
    PRIMARY
    KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=43 ;

    Les valeurs par défaut sont pour quand je remplis moi la table.

    La table "comments" qui contient des commentaires ainsi que des notes.

    Code SQL :
    Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE IF NOT EXISTS
    `comments`
    ( `id_comment` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    `name`
    varchar(128) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
    `url` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
    `email`
    varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
    `body`
    text COLLATE utf8_unicode_ci NOT NULL,
    `dt`
    timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `id_places` int(9) NOT NULL,
    `validate`
    int(1) NOT NULL DEFAULT '0',
    `total_votes`
    int(11) NOT NULL,
    `total_value`
    int(11) NOT NULL,
    `used_ips`
    longtext COLLATE utf8_unicode_ci NOT NULL,
    PRIMARY KEY (`id_comment`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=44 ;



    Les champs communs au deux table sont places.id et comments.id_places.

    Je souhaite donc créer un listing des établissements avec leur note moyen en faisant une sélection par type d’établissement et par région, puis trier par le champ "order" de la table place qui est en faite juste un ordre d'affichage fixer par moi.


    J’espère être compréhensible. Je n'ai pas l'habitude des forums.
    Désolé pour les fautes, mais je suis vraiment nul...


    Marco

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Ben à part les jointures vieilles de 20 ans, votre requête n'était pas si mal en fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT p.id, p.title, p.lat, p.lng, p.type, p.address, p.mg_region, 
    	p.uri, p.phon1, p.phon2, p.fax, p.categorie, p.owner_email, p.description,
    	COALESCE(SUM(c.total_value) / SUM(c.total_votes), 'undefined') AS moyenne
    FROM places p
    LEFT OUTER JOIN comments c ON c.id_places = p.id
    WHERE p.approved = 1
    	AND p.mg_region = '$region'
    	AND p.type = '$type'
    GROUP BY p.id, p.title, p.lat, p.lng, p.type, p.address, p.mg_region,
    	p.uri, p.phon1, p.phon2, p.fax, p.categorie, p.owner_email, p.description, p.`order`
    ORDER BY p.`order`
    Une dernière chose : "order" est une mot réservé du langage SQL, la colonne ne devrait pas être nommée ainsi.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

Discussions similaires

  1. Select sur 2 tables avec deux colonnes identiques
    Par LsMarx dans le forum Requêtes
    Réponses: 4
    Dernier message: 07/08/2012, 17h08
  2. select sur 2 tables avec Like
    Par serna dans le forum Débuter
    Réponses: 16
    Dernier message: 05/01/2010, 10h36
  3. requete sur 4 tables avec sum et soustration
    Par afroweb dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 23/01/2009, 17h28
  4. Réponses: 4
    Dernier message: 23/10/2006, 10h09
  5. aide pour requete sur 2 tables avec clé étranere
    Par richton95 dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/12/2005, 14h32

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