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 :

Requete SQL avec 2 tables et condition de date+somme [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 86
    Points : 33
    Points
    33
    Par défaut Requete SQL avec 2 tables et condition de date+somme
    Bonjour,

    J'ai un souci avec une requête SQL.

    J'aimerai afficher sur la page d'un membre tout les jeu auquel il participe.

    Commençons par les schéma des SQL

    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
    CREATE TABLE `table_jeu` (
      `id` int(11) NOT NULL auto_increment,
      `nom` varchar(200) NOT NULL,
      `datedebut` datetime NOT NULL,
      `datefin` datetime NOT NULL,
      `idmembre` varchar(30) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
     
    CREATE TABLE `jeu_vote` (
      `id` int(10) NOT NULL auto_increment,
      `idmembre` varchar(10) NOT NULL,
      `date` datetime NOT NULL,
      `nb_vote` varchar(5) NOT NULL,
      `idconcours` varchar(5) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=60383 DEFAULT CHARSET=latin1 AUTO_INCREMENT=60383 ;
    J'aimerai afficher en fonction de la variable utilisateur que je place dans $idmembre tout les jeu auquel il participe pour cela plusieurs condition :

    - Afficher uniquement si le jeu est en cours c'est a dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date between '$infos_jeu[datedebut]' and  '$infos_jeu[datefin]'
    - Si il y a au moins 1 enregistrement dans la table "jeu_vote" en fonction de l'id concours

    - faire la somme de nb_vote mais je crois qu'il suffit de faire : SELECT *, SUM(nb_vote).

    Je suis vraiment pas bonne en SQL

    J'aimerai arriver a cet affichage (Rappel : Si il y a aucun enregistrement de l'IDmembre dans la table jeu_vote on affiche pas le jeu) :

    Nom du jeu 1
    affichage du nombre de vote

    nom du jeu 2
    affichage du nombre de vote

    etc ....

    Merci de votre soutien
    Lou

  2. #2
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Construisons la requête progressivement...
    Afficher uniquement si le jeu est en cours
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT j.id
    FROM table_jeu j
    WHERE CURRENT_DATE BETWEEN j.datedebut AND j.datefin

    Si il y a au moins 1 enregistrement dans la table "jeu_vote" en fonction de l'id concours
    Je vois que id_concours est de type VARCHAR(5), ce qui est déjà en soi un mauvais choix, mais surtout ce n'est pas le type de l'identifiant de table_jeu qui est lui, comme il se doit, un entier auto-incrémenté.
    Est-ce que votre phrase signifie que jeu = concours ?
    il y a alors un problème dont vous vous seriez aperçue si vous aviez utilisé le moteur InnoDB pour vos tables et mis en œuvre les contraintes de clés étrangères !

    faire la somme de nb_vote
    Pour ça aussi, il faut joindre les deux tables d'une manière ou d'une autre et donc avoir des types équivalents dans la condition de jointure.

    Nous ne pouvons donc aller plus loin en l'état. Corrigez d'abord la structure de votre BDD. Et si jeu = concours, appelez la clé étrangère idjeu et pas idconcours !

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 86
    Points : 33
    Points
    33
    Par défaut
    Bonjour

    Merci de ta réponse

    je viens de corriger

    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
    CREATE TABLE `table_jeu` (
      `id` int(11) NOT NULL auto_increment,
      `nom` varchar(200) NOT NULL,
      `datedebut` datetime NOT NULL,
      `datefin` datetime NOT NULL,
      `idmembre` int(30) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
     
    CREATE TABLE `jeu_vote` (
      `id` int(10) NOT NULL auto_increment,
      `idmembre` int(10) NOT NULL,
      `date` datetime NOT NULL,
      `nb_vote` varchar(5) NOT NULL,
      `idconcours` int(5) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=60383 DEFAULT CHARSET=latin1 AUTO_INCREMENT=60383 ;
    Est-ce que votre phrase signifie que jeu = concours ?
    je voulez dire que si il y avait aucun enregistrement dans la table 'jeu_vote' du membre alors on affiche pas
    Pour ne pas faire de bétise car je suis pas trop claire je pense
    table_jeu.id = jeu_vote.idconcours

    j'espere avoir apporté les réponses attendue

  4. #4
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Bon, il faudrait plutôt INT(11) mais ça n'a pas beaucoup d'importance. Du moment que c'est un INT, c'est sur 4 octets et la précision entre parenthèses ne compte pas.

    Par contre, comme je le disais précédemment, puisque :
    table_jeu.id = jeu_vote.idconcours
    Alors autant nommer la colonne id_jeu et pas idconcours !

    Reprenons donc la construction de la requête. Nous en étions là :
    Citation Envoyé par CinéPhil
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT j.id
    FROM table_jeu j
    WHERE CURRENT_DATE BETWEEN j.datedebut AND j.datefin
    Si il y a au moins 1 enregistrement dans la table "jeu_vote" en fonction de l'id concours
    Ceci sera obtenu par une jointure interne entre les deux tables :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT j.id
    FROM table_jeu j
    INNER JOIN jeu_vote v ON v.idconcours = j.id
    WHERE CURRENT_DATE BETWEEN j.datedebut AND j.datefin

    faire la somme de nb_vote
    Cette fois, il faut un groupage et une somme :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT j.id,
    	SUM(v.nb_vote) AS nombre_votes
    FROM table_jeu j
    INNER JOIN jeu_vote v ON v.idconcours = j.id
    WHERE CURRENT_DATE BETWEEN j.datedebut AND j.datefin
    GROUP BY j.id

    J'aimerai afficher en fonction de la variable utilisateur que je place dans $idmembre tout les jeu auquel il participe
    Je suppose ici que la participation du membre au jeu est donnée par la colonne idmembre de la table_jeu ?
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT j.id,
    	j.nom AS nom_jeu,
    	SUM(v.nb_vote) AS nombre_votes
    FROM table_jeu j
    INNER JOIN jeu_vote v ON v.idconcours = j.id
    WHERE j.idmembre = '$idmembre'
    	AND CURRENT_DATE BETWEEN j.datedebut AND j.datefin
    GROUP BY j.id, j.nom

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 86
    Points : 33
    Points
    33
    Par défaut
    Re bonjour,

    Je viens de tester ca a l'air de fonctionner pour cette requête mais la variable $idmembre ne fonctionne pas (Quand je me loggue avec un autre compte) j'ai le même résultat qui s'affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $re = mysql_query("
    SELECT j.id,
    	j.nom AS nom_jeu,
    	SUM(v.nb_vote) AS nombre_votes
    FROM table_jeu j
    INNER JOIN jeu_vote v ON v.idconcours = j.id
    WHERE CURRENT_DATE BETWEEN j.datedebut AND j.datefin
    GROUP BY j.id
    ");
     
    while ($d=@mysql_fetch_array($re)) {
    echo "$d[nom_jeu] - $d[nombre_votes]<br>";
    }
    cependant dés que je met la dernière requête ça ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Je suppose ici que la participation du membre au jeu est donnée par la colonne idmembre de la table_jeu ?
    La participation du membre est donnée dés l'instant ou ou il y a un enregistrement dans idmembre de vote_jeu

    Merci de ton aide

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 86
    Points : 33
    Points
    33
    Par défaut
    ah ca fonctionne

    j'ai modifié par WHERE v.idmembre = '$idmembre'

    je teste et confirme


    merci CinePhil !!!!!!

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

Discussions similaires

  1. Optimisation Requete SQL avec grosse table
    Par macsigarev dans le forum Requêtes
    Réponses: 10
    Dernier message: 27/11/2012, 16h48
  2. SSIS - Requete sql avec nom de table variable
    Par IcedLand dans le forum Développement
    Réponses: 3
    Dernier message: 03/12/2007, 12h55
  3. Réponses: 5
    Dernier message: 03/09/2007, 14h52
  4. Requete SQL avec NOM de champs et de table dynamique
    Par _stef_ffff_f34 dans le forum Bases de données
    Réponses: 4
    Dernier message: 15/05/2006, 14h28
  5. [Access] requete sql avec condition sur date
    Par qeja dans le forum Langage SQL
    Réponses: 4
    Dernier message: 26/03/2006, 00h54

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