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

Langage PHP Discussion :

Requete count durée


Sujet :

Langage PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 24
    Par défaut Requete count durée
    Bonjour.

    Je suis actuellement en train de créer une base de données concernant une CDthèque.

    Je suis en train d'essayer de faire deux requêtes:
    - La première calcule la somme de la durée de tous morceaux et les classent par groupe.
    J'ai pensé à cette requête mais il y a encore des erreurs

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select sum(Morceau.Duree_morceau - cast ('00:00' as time),Groupe.Nom_groupe
    From Morceau, A_realise, Groupe
    Where A_realise.Id_Morceau=Morceau.Id_morceau
    and A_realise.Id_groupe=Groupe.Id_groupe
    Group by Groupe.Nom_groupe;
    J'ai une table Morceau comportant la durée (j'ai mis comme type TIME mais toutes mes durées sont saisies de la forme 00:00).
    Ma base de données pour cette requête est composé:
    - d'une table Morceau (avec Id_morceau,Num_piste,Nom_morceau, Duree_morceau, Id_genre),
    - d'une table Groupe (Id_groupe, Nom_groupe)
    - et d'une table A_realise (Id_morceau, Id_groupe) qui associe les 2 tables précédentes

    La seconde requête permet d'afficher pour le groupe qui a la "durée cumulée" la plus faible, le titre le plus longtemps.
    Pour ce faire je pense justement utiliser la requête ci-dessus rechercher le min...

    En attendant vos réponses,
    @ bientôt

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Quelle est la question ?

    Au passage, les jointures se font avec JOIN et non en mettant une égalité dans le WHERE.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 24
    Par défaut
    Ma question est en fait comment effectuer ces requêtes car je n'arrive pas à trouver quel type mettre pour mes durées écrites en 00:00 => type TIME?
    Et comment calculer la somme de la durée des morceaux pour chaque groupe, et dans une seconde requête la recherche de la durée maximum pr un groupe qui a composé des morceaux ds plusieurs albums.

    On m'avait dit que les jointures étaient faisables de cette manière... après je peux passer aux inner join.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    TIME ca me parrait pertinent pour stocker des temps non ?
    Pour faire des totaux, utilise SUM()
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 59
    Par défaut
    Je mettrais plutot un int et la durée en seconde, ca risque d'être moins prise de tête pour les calculs, et pour l'affichage en minute seconde, tu te fais une petite fonction avec des modulos, je me demande même s'il y a pas déja des fonctions toutes faite en php pour ca.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 24
    Par défaut
    En fait j'ai déjà saisi mes 286 morceaux avec une durée écrite de la façon suivante 00:00 c'est pourquoi j'aimerai mieux garder cette typographie. De plus c'est celle utilisée sur les sites de musiques.
    En fait on devait faire une partie du projet sous access, j'ai donc exporté en .txt et effectué les modifications en langage sql.

    Quand j'execute la requete suivante

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Select sum(Morceau.Duree_morceau - cast ('00:00' as time), Groupe.Nom_groupe
    From Morceau, A_realise, Groupe
    Where A_realise.Id_Morceau=Morceau.Id_morceau
    and A_realise.Id_groupe=Groupe.Id_groupe
    Group by Groupe.Nom_groupe;

    j'ai le droit à

    "#1584 - Incorrect parameters in the call to stored function 'cast'"
    => Il ne prendrait pas mon type dans le cast

    Je précise que j'ai utilisé le type time pour la saisie des durées.

  7. #7
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 59
    Par défaut
    En fait j'ai jeté un œil ici : http://dev.mysql.com/doc/refman/5.0/fr/time.html
    Et apparemment pas besoin de cast si ton format est déjà du style mm:ss.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 24
    Par défaut
    En fait j'avais essayé sans le cast mais la requête me donne les résultats suivants:

    sum(Morceau.Duree_morceau)
    145
    122
    93
    408
    177

    Et on ne dirait pas des durées mais plutôt des entiers

  9. #9
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 59
    Par défaut
    Bah faut faire un choix

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Effectivement SUM() ne donne pas le résultat attendu, il faut visiblement ruser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SEC_TO_TIME( SUM( TIME_TO_SEC(Morceau.Duree_morceau) ) ) AS duree
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 24
    Par défaut
    Cela fonctionne! Merci j'ai bien une durée

    duree
    00:02:25
    00:02:02
    00:01:33
    00:06:48
    00:02:57

    Cependant selon cette typo on a 00:02:25 on peut penser que c'est 02 min et 25 secondes?! Bizarre j'aimerai un truc du type .. heures, ..min et ..s => 00:00:00

    J'y cogite de mon coté mais si vous avez des idées...

  12. #12
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    on peut penser que c'est 02 min et 25 secondes
    c'est 2min et 25secondes
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 24
    Par défaut
    Ah d'accord donc il y a un problème dans ma requête car il ne fait pas la somme de la durée de tous les morceaux et ce pour chaque groupe

  14. #14
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Tu devrais faire de vraies jointures utilisant JOIN
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 24
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT SEC_TO_TIME( SUM( TIME_TO_SEC(Morceau.Duree_morceau) ) ) AS duree, Groupe.Nom_groupe
    From Groupe INNER JOIN (Morceau INNER JOIN A_realise ON Morceau.Id_morceau = A_realise.Id_morceau) ON Groupe.Id_groupe = A_realise.Id_groupe;
    Group by Groupe.Nom_groupe;



    Mais il n'accepte pas le groupe by ...
    Après il faut que je trouve le maximum de ça, puis le titre le plus long pour le groupe qui a fait une durée cumulée la plus courte ^^bien marrant

  16. #16
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT SEC_TO_TIME( SUM( TIME_TO_SEC(Morceau.Duree_morceau) ) ) AS duree, Groupe.Nom_groupe
    From Groupe 
    JOIN A_realise ON Groupe.Id_groupe = A_realise.Id_groupe
    JOIN Morceau ON Morceau.Id_morceau = A_realise.Id_morceau
    Group by Groupe.Nom_groupe;
    Quelle erreur rencontres-tu ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 24
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT SEC_TO_TIME( SUM( TIME_TO_SEC(Morceau.Duree_morceau) ) ) AS duree, Groupe.Nom_groupe
    From Groupe 
    JOIN A_realise ON Groupe.Id_groupe = A_realise.Id_groupe
    JOIN Morceau ON Morceau.Id_morceau = A_realise.Id_morceau
    Group by Groupe.Nom_groupe;
    Quelle erreur rencontres-tu ?
    L'erreur que je rencontre est que la requête me retourne
    duree Nom_groupe
    00:02:25 BROUSSAI
    00:02:02 OLIVIA RUIZ
    00:01:33 RENAN LUCE
    00:06:48 TRYO
    00:02:57 VOLO

    Alors que les résultats pour la durée devraient être en heures, min, secondes car 02 min 25 s ça fait juste pour l'album saisi

    De plus j'ai du mal pour la requête qui affiche le titre du morceau le plus long pour le groupe qui a fait une durée totale la plus courte.
    je pense qu'il faut inclure la requête ci-dessus dedans (avec un min de la requete)
    Morceau: Id_morceau, Num_piste, Nom_morceau, Duree_morceau, Id_genre
    et après mettre un where max Duree_morceau
    Bref je ne vois pas trop comment boutiquer tout ça

  18. #18
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Est-ce que tu as les bons resultats

    si tu additionnes deux morceaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT SEC_TO_TIME( SUM( TIME_TO_SEC(Morceau.Duree_morceau) ) ) AS duree
    From  Morceau 
    WHERE id_morceau = 5678 OR id_morceau = 1234
    si tu additionnes les morceaux d'un groupe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT SEC_TO_TIME( SUM( TIME_TO_SEC(Morceau.Duree_morceau) ) ) AS duree
    From  Morceau 
    JOIN A_realise ON Morceau.Id_morceau = A_realise.Id_morceau
    WHERE Id_groupe = 57463
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 24
    Par défaut
    En fait je m'étais trompé de format d'heure.

    Pourriez vous m'aidez à partir de la requête précédente à faire la requête qui affiche le titre du morceau le plus long pour le groupe qui a fait une durée totale la plus courte.

    Morceau: Id_morceau, Num_piste, Nom_morceau, Duree_morceau, Id_genre

    Mais il faut faire intervenir la durée maximum pour rechercher le titre le plus long pour ce groupe et je ne vois pas.

    J'ai fait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT SEC_TO_TIME( SUM( TIME_TO_SEC(Morceau.Duree_morceau) ) ) AS 'duree', Groupe.Nom_groupe
    From Groupe 
    INNER JOIN A_realise ON Groupe.Id_groupe = A_realise.Id_groupe
    INNER JOIN Morceau ON Morceau.Id_morceau = A_realise.Id_morceau
    Group by Groupe.Nom_groupe
    HAVING duree = (SELECT MAX('duree') FROM Groupe, A_realise, Morceau WHERE Groupe.Id_groupe = A_realise.Id_groupe AND Morceau.Id_morceau = A_realise.Id_morceau);
    Qui s'exécute mais ne me retourne aucune valeur... est ce que la syntaxe est bonne?

    Cordialement

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 24
    Par défaut
    Voilà mes requêtes mais j'ai encore des erreurs, si vous pouviez m'aider:

    -Afficher le nom du groupe pour laquelle la durée cumulée des morceaux est la plus longue
    => Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ',' or ';' in /Applications/MAMP/htdocs/CDtheque/requete_maxgpe.php on line 41
    Mais je ne vois pas le soucis.

    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
    <?php
     
    	$query1 = mysql_query("SELECT ( SUM( TIME_TO_SEC(Morceau.Duree_morceau) ) ) AS 'duree', Nom_groupe AS 'groupe'
    						FROM Groupe, A_realise, Morceau
    						WHERE Groupe.Id_groupe = A_realise.Id_groupe
    						AND Morceau.Id_morceau = A_realise.Id_morceau
    						Group by Groupe.Nom_groupe") or die(mysql_error());
    	$duree = 0;    //on initialise la duree à 0
    	$groupe = ''; // on initialise le gpe à ''
    	while ($datas = mysql_fetch_array($query1)) 
    	{
    		if ($datas['duree'] > $duree)    //si la durée est >0 alors duree et groupes
    		{
    		$duree = $datas['duree'];
    		$groupe = $datas['groupe']; //prend la nouvelle valeur
    		}
    	}	//on fait la boucle pr chercher la durée maximum
    			echo '<p><table border="2" width="35%">';
    			echo '<tr><th>Groupe</th><th>Nom </th><th>Duree/th><tr/>';
    			echo *"<tr><td>".$groupe."</td><td>".$duree."</td>";
    			echo "</table><p/>";
    ?>

    - Afficher le morceau le plus long pour le groupe qui a la durée cumulée la plus courte
    => Parse error: syntax error, unexpected T_VARIABLE in /Applications/MAMP/htdocs/CDtheque/requete_titrelong.php on line 30
    Il n'a pas l'air d'accepter
    $groupe = $datas['groupe'];
    $ok = true;

    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
    34
    35
    36
    <?php
     
    $query1 = mysql_query("SELECT ( SUM( TIME_TO_SEC(Morceau.Duree_morceau) ) ) AS 'duree', Nom_groupe
    						FROM GROUPE, A_realise, Morceau
    						WHERE Groupe.Id_groupe = A_realise.Id_groupe
    						AND Morceau.Id_morceau = A_realise.Id_morceau
    						Group by Groupe.Nom_groupe") or die(mysql_error());
    	$duree = 0; ***// initialisation $duree
    	$groupe = ""; // initialisation $groupe
    	$ok = false;
    	while ($datas = mysql_fetch_array($query1)) 
    	{
    		if ($ok == false) // on est au premier tour de boucle
    		{
    			$duree = $datas['duree']; // alors duree prend la valeur de la première durée
    			$groupe = $datas['groupe'];
    			$ok = true; // comme ça au deuxième tour on ne rentre pas dans la boucle qui initialise à la première valeur
    		}
    		if ($datas['duree'] < $duree)
    		{
    			$duree = $datas['duree'];
    			$groupe = $datas['groupe'];
    		}
    	}
     
     
    $query2 = mysql_query("SELECT Morceau.Nom_morceau, Groupe.Nom_groupe, (TIME_TO_SEC(Morceau.Duree_morceau) as 'duree'
    						FROM GROUPE, A_realise, Morceau
    						WHERE Groupe.Nom_morceau = '$groupe'") or die(mysql_error());
    			while ($datas = mysql_fetch_array($query2)) 
    			{
    			echo '<p><table border="2" width="35%">';
    			echo '<tr><th>Titre</th><th>Duree </th><th>Groupe/th><tr/>';
    			echo  "<tr><td>".$reponse['Nom_morceau']."</td><td>".$reponse['Duree_morceau']."</td><td>".$reponse['Nom_groupe']."</td>";
    			echo "</table><p/>" 
    ?>
    Un coup de pouce serait le bienvenue vu le temps passé sur ces requêtes.
    Merci d'avance

Discussions similaires

  1. Réponses: 7
    Dernier message: 05/11/2005, 15h53
  2. Requete COUNT sur 3 tables
    Par Le-Cortex dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/09/2005, 10h39
  3. pb avec une requete assez dure
    Par critok dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/04/2005, 11h53
  4. Requete Count
    Par Slayes dans le forum Langage SQL
    Réponses: 11
    Dernier message: 23/01/2005, 19h01
  5. Aide pour une requete ... "COUNT(*)"
    Par mechantebestiole dans le forum Langage SQL
    Réponses: 13
    Dernier message: 25/05/2004, 16h27

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