Somme de la duree

Mammouth du PHP | 725 Messages

29 août 2012, 09:36

Bonjour,

J'ai une table des chansons avec leurs durees, et je voudrais recuperer le total des durees des chansons:
$skl = 'SELECT SUM(file_duration) FROM `chansons`';
$skReq = $connexion->query($skl);
$skRes = $skReq->fetchAll();

echo '<br />';
var_dump($skRes);
echo '<br />';

foreach($skRes as $kh=>$vh)
	{
		$file_duration = $vh['SUM[file_duration]'];
		echo $file_duration;
	}
ne retourne rien

Merci a vous

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

29 août 2012, 12:17

salut,

Ne retourne rien ?

$file_duration = $vh['SUM[file_duration]']; <= sum[file_duration] ne doit pas exister dans ton tableau.

que donne le var_dump ?

As tu essayé la requête dans une console SQL ?

généralement SUM est associé à un group by.

quel est la structure de la table (describe ou create table)

y a t'il une structure try / catch pour récupérer les erreur et les afficher ?

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

30 août 2012, 08:38

voici le resultat de SUM:

Code : Tout sélectionner

array(16) { [0]=> array(2) { ["SUM(file_duration)"]=> string(1) "0" [0]=> string(1) "0" } [1]=> array(2) { ["SUM(file_duration)"]=> string(5) "65773" [0]=> string(5) "65773" } [2]=> array(2) { ["SUM(file_duration)"]=> string(5) "81295" [0]=> string(5) "81295" } [3]=> array(2) { ["SUM(file_duration)"]=> string(5) "73284" [0]=> string(5) "73284" } [4]=> array(2) { ["SUM(file_duration)"]=> string(1) "0" [0]=> string(1) "0" } [5]=> array(2) { ["SUM(file_duration)"]=> string(1) "0" [0]=> string(1) "0" } [6]=> array(2) { ["SUM(file_duration)"]=> string(6) "114135" [0]=> string(6) "114135" } [7]=> array(2) { ["SUM(file_duration)"]=> string(5) "98877" [0]=> string(5) "98877" } [8]=> array(2) { ["SUM(file_duration)"]=> string(6) "108416" [0]=> string(6) "108416" } [9]=> array(2) { ["SUM(file_duration)"]=> string(6) "113268" [0]=> string(6) "113268" } [10]=> array(2) { ["SUM(file_duration)"]=> string(1) "0" [0]=> string(1) "0" } [11]=> array(2) { ["SUM(file_duration)"]=> string(1) "0" [0]=> string(1) "0" } [12]=> array(2) { ["SUM(file_duration)"]=> string(1) "0" [0]=> string(1) "0" } [13]=> array(2) { ["SUM(file_duration)"]=> string(1) "0" [0]=> string(1) "0" } [14]=> array(2) { ["SUM(file_duration)"]=> string(1) "0" [0]=> string(1) "0" } [15]=> array(2) { ["SUM(file_duration)"]=> string(1) "0" [0]=> string(1) "0" } }

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

30 août 2012, 13:05

Y a 15 chansons dans la table ?

peux tu nous fournir le create tables et un jeux de données pour tests ?


parce que la je ne vois pas trop.

ceci dit sans group by je pense que c'est normale.


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

30 août 2012, 17:05

voici une partie de la table:
--
-- Table structure for table `chansons_test`
--

CREATE TABLE IF NOT EXISTS `chansons_test` (
  `num` tinyint(3) NOT NULL,
  `idch` tinyint(3) NOT NULL,
  `chanson` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `downloaded` bigint(5) NOT NULL DEFAULT '0',
  `heard` bigint(5) NOT NULL DEFAULT '0',
  `idpseudo` int(5) NOT NULL COMMENT 'person who added this',
  `file_duration` bigint(6) NOT NULL DEFAULT '0',
  `file_size` bigint(10) NOT NULL DEFAULT '0',
  `file_bitrate` int(3) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

--
-- Dumping data for table `chansons_test`
--

INSERT INTO `chansons_test` (`num`, `idch`, `chanson`, `downloaded`, `heard`, `idpseudo`, `file_duration`, `file_size`, `file_bitrate`) VALUES
(1, 1, 'Chanosn1', 0, 0, 3, 65773, 0, 0),
(2, 1, 'Chanosn2', 0, 0, 3, 81295, 0, 0),
(3, 1, 'Chanosn3', 0, 0, 3, 73284, 0, 0),
(4, 1, 'Chanosn4', 0, 0, 3, 114135, 0, 0),
(5, 1, 'Chanosn5', 0, 0, 3, 98877, 0, 0);

Eléphant du PHP | 229 Messages

31 août 2012, 06:44

Bonjour,



A ma conaissance SUM s'utilise avec as pour le nommer.
En plus tu dois utilisr mktime pour travailler des durées(enfin je crois, pour la base 60). Je suis pas sûr du nom de la fonction.

Bon codage.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

31 août 2012, 17:14

A ma conaissance SUM s'utilise avec as pour le nommer.
Pas obligatoire mais effectivement plus pratique (sinon faut utiliser sum(lenomduchamp) comme de colonne) :)
En plus tu dois utilisr mktime pour travailler des durées(enfin je crois, pour la base 60). Je suis pas sûr du nom de la fonction.
la je ne te suis pas :)

un entier semble bien il permet d'avoir le nombre de secondes ensuite un calcule pour le nombre de minutes / secondes.
mktime retourne un timestamp, donc moyen bof.
Par contre mysql propose un type TIME qui corresspond à une heure (HH:MM:SS).
http://dev.mysql.com/doc/refman/5.0/fr/ ... rview.html

Sinon SUM ne s'utile qu'avec un group by.

donc la pas possible.

je t'ai fait un petit fonction MySQL (une UDF ;) ) qui fait ce que tu souhaite. corrige ne nom de la table avant de l'essayer (dans la définition du curseur).
Il est aussi possible d'utiliser une procédure stockée avec un paramètre de sortie (mais je ne sais plus s'il est bien interprété par PDO).

Je t'invite à regarder un cours sur les UDF, pour comprendre ce que j'ai fait (par exemple sur http://sqlpro.developpez.com

@+
delimiter |
create function tpstotal ()
returns bigint
begin
	declare total bigint default 0;
	declare done int default 0;
	declare tmp int;
	declare curseur cursor for select file_duration from chansons_test;
	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
	open  curseur;
	repeat
		fetch curseur into tmp;
		if not done then
			set total = total+tmp;
		end if;
	until done end repeat;
	close curseur;
	return total;
end |
delimiter ;
Il en faut peu pour être heureux ......

Eléphant du PHP | 229 Messages

31 août 2012, 20:25




la je ne te suis pas :)
Ok je suis désolé, mais je suis débutant aussi ^^

Mammouth du PHP | 725 Messages

01 sept. 2012, 03:46

j'ai jamais vu ce genre de fonctions, est ce que c'est le seul moyen de calculer la SUM, et c'est pas possible avec GROUP BY

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

01 sept. 2012, 11:26

Pour sum, faut un group by, ne sachant pas sur quoi grouper tu n'a pas le choix.

Un simple select lafonction() as total; et c'est bon.

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

02 sept. 2012, 08:37

et je peux utiliser un GROUP BY si ca marche, pourquoi pas

Mammouth du PHP | 725 Messages

04 sept. 2012, 04:03

une petite modification avec GROUP BY:
$skl = 'SELECT idch, SUM(file_duration) FROM `chansons` GROUP BY idch';
$skReq = $connexion->query($skl);
$skRes = $skReq->fetchAll();

foreach($skRes as $kh=>$vh)
        {
                $file_duration = $vh['SUM[file_duration]'];
        }

                echo $file_duration;
toujours en vain, c'est 0

ViPHP
ViPHP | 2577 Messages

04 sept. 2012, 08:27

Essayes pluôt :
<?PHP
$skl = 'SELECT idch, SUM(file_duration) FROM `chansons` GROUP BY idch';
$skReq = $connexion->query($skl);
$skRes = $skReq->fetchAll();
foreach($skRes as $kh=>$vh)
        {
                $file_duration = $vh['SUM(file_duration)'];   // attention tu avais mis un ] au lieu de ) d'ou ton problème
                echo $file_duration,'<br>';                                   // à faire à chaque itération sinon tu affiches juste le dernier 
        }
?>
Autrement, SELECT SUM(file_duration) FROM `chansons` fonctionne ! je viens de tester : SELECT SUM( id )
FROM `stats_access` chez moi.

Il faudrait que tu actives les erreurs php : error_reporting(E_ALL); pour voir les erreurs comme ne pas mettre le bon nom de colonne.

Il serai mieux de faire SELECT SUM(file_duration) as total FROM `chansons` parce que c'est plus facile d'écrire 'total' que 'SUM(file_duration)' pour récupérer la valeur

Mammouth du PHP | 725 Messages

05 sept. 2012, 00:43

J'ai fais as totalDuration
$totalDuration = $vh['totalDuration'];
echo $totalDuration.'<br />';
les valeurs affichees ne sont pas cumulees, resultat:

Code : Tout sélectionner

65773 81295 73284 etc..
Comment faire la somme de ses resultats

ViPHP
ViPHP | 2577 Messages

05 sept. 2012, 08:01

Vire le "group by" qui n'est pas obligatoire.