MAX et MIN

Mammouth du PHP | 725 Messages

13 déc. 2012, 03:27

Bonjour,

Je fais un requete afin d'avoir la duree minimale et maximale d'un album:
SELECT id_al, MIN(album_duration) as minDuration FROM albums GROUP BY id_al ORDER BY album_duration ASC LIMIT 1';
Elle me retourne pas les bonnes valeurs, je veux recuperer juste l'album qui a la duree minimale

Comme sur cette exemple, la valeur que je dois avoir est: 89.95
Merci a vous

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

13 déc. 2012, 09:30

Salut,

Dans l'exemple le min de la table c'est 3,99 pas 89 ;)

Si tu l'album qui a la plus petite durée de la table il ne faut pas utiliser de group by, dans ce cas le moteur SQL prend toute la table pour la recherche.

Dans l'exemple, le group by perf d'avoir le plus petit prix par type d'objet et non le plus petit prix de la table.

Si tu souhait la plus petite durée par genre musical ton code correct sauf que le groupement doit être fait sur la colonne indiquant le genre ;)

Globalement grouper sur la clef primaire de la table est inutile car par essence unique ;)

Et pour finir, pas besoin de limit, si tu utilise min, sans group by, tu n'auras qu'un seul tuple résultat !

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

Mammouth du PHP | 725 Messages

13 déc. 2012, 10:10

desole c'etait la valeur max, je travaille sur les 2 cas:

MAX: le code serait comme suivant pour avoir 89.95
SELECT id_al, MAX(album_duration) AS minDuration FROM albums ORDER BY album_duration ASC
Pas le bon resultat

Mammouth du PHP | 725 Messages

03 janv. 2013, 03:11

j'ai mis le champs de album_duration en varchar, je pense pas que ca va me donner un bon resultat

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

03 janv. 2013, 10:42

j'ai mis le champs de album_duration en varchar, je pense pas que ca va me donner un bon resultat

Effectivement un entier semble plus indiqué ;)


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

Mammouth du PHP | 725 Messages

04 janv. 2013, 01:56

voici le code final:
SELECT id, MAX(album_duration) as maxDuration FROM albums ORDER BY MAX(album_duration) DESC LIMIT 1
ce code me selectionne la duree maximale, mais ne correspond pas a cet id:
id duree
1 20
2 30
3 15
4 32
alors le resultat devait etre:

id = 4 qui a la duree maximale, alors il me donne comme resultat, duree maximale est 32 correspondant a l'id 1

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

04 janv. 2013, 12:19

yop,

est ce qu'une requête de ce style t'irais ?
select * from albums where album_duration= (SELECT  MAX(album_duration) AS maxDuration FROM albums)
elle retourne ce que tu souhaite, mais attention tu peux avoir plusieurs tuples (en cas de durée identique).


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

ViPHP
ViPHP | 2577 Messages

04 janv. 2013, 14:53

Je pense qu'il manque un "group by id" qui éviterai une requete imbriquée (çaymal)
SELECT id, MAX(album_duration) AS maxDuration FROM albums group by id ORDER BY MAX(album_duration) DESC LIMIT 1

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

05 janv. 2013, 12:27

Non parçe que la il va différencier tout les id, qui par nature sont différent donc totalement inutile dans ce cas.


Quand au requête imbriquée malheureusement des fois on a pas le choix :)



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

Mammouth du PHP | 725 Messages

09 janv. 2013, 09:18

j'ai mis le group by et j'ai differencie les id des tables, merci a vous

Une question "Bete":

Je veux cumuler la somme d'une seule requete suivant un foreach:
<?php

// je selectionne les chanteurs
	$Selsh = 'SELECT id_shk FROM shk_tbl WHERE shk_fname LIKE "%'.$shkName.'%"';
	//echo $Selsh.'<br />';
	$Reqsh = $connexion->query($Selsh);
	$Ressh = $Reqsh->fetchAll();
	
// j'obtien l'id de chaque chanteur
			foreach($Ressh as $ShK=>$ShV)
			{
				$id_shk = $ShV['id_shk'];

	 // je cherche la duree de l'album
	$SelSil = 'SELECT SUM(album_duration) as totalAlbumDuration FROM `shk_album` WHERE idshk2 = "'.$id_shk.'"';
	//echo $SelSil.'<br />';
			
			
			$ReqSil = $connexion->query($SelSil);
			$ResSil = $ReqSil->fetchAll();
			//echo count($ResSil).'<br />';
			
			$totalD = '';
			
			foreach($ResSil as $SK=>$SV)
			{
				$totalD .= $SV['totalAlbumDuration'];
			}
			
			echo 'total est: '.$totalD.'<br />';
}
?>

J'aurais par exemple 3 chanteurs, avec 5 albums, et je veux faire le cumul des durees des 5 albums

merci

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

09 janv. 2013, 09:26

Salut,


Si tu nous donnez la structure exacte de la table et ce que tu veux faire au final se serait plus simple ;)

Parce que la pour le coup la solution de Mazarini est bonne mais avec un group by sur l'id du chanteur (plus la clause where pour limiter aux id que tu veux).

Parce que la tu va faire une tonne de requête SQL alors que tu n'as pas besoin ;)

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

Mammouth du PHP | 725 Messages

09 janv. 2013, 10:17

voici la structure des 2 tables:
CREATE TABLE IF NOT EXISTS `shk_tbl` (
  `id_shk` int(5) NOT NULL AUTO_INCREMENT,
  `shk_fname` varchar(30) COLLATE utf8_unicode_ci NOT NULL COMMENT 'first name',
  `shk_mname` varchar(200) COLLATE utf8_unicode_ci NOT NULL COMMENT 'middle name',
  `shk_lname` varchar(30) COLLATE utf8_unicode_ci NOT NULL COMMENT 'last name',
  PRIMARY KEY (`id_shk`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE IF NOT EXISTS `shk_album` (
  `id_alb` int(5) NOT NULL AUTO_INCREMENT,
  `idshk2` int(3) NOT NULL,
  `album_name` varchar(10) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0',
  `album_duration` decimal(20,10) NOT NULL DEFAULT '0.0000000000',
  `album_size` varchar(10) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0',
  PRIMARY KEY (`id_mus`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
c'est une recherche sur un nom du chanteur, que je veux afficher la duree de chaque album ainsi que la duree totale des albums:

Duree totale des albums est: XXXXXX
Taille totale des albums est: YYYYY

+ Chanteur1
+ Chanteur2
+ Chanteur3
Etc

Merci

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

09 janv. 2013, 23:24


c'est une recherche sur un nom du chanteur, que je veux afficher la duree de chaque album ainsi que la duree totale des albums:

Duree totale des albums est: XXXXXX
Taille totale des albums est yyyyy
Tu va dire que je suis bête mais la pour mois c'est la même chose ;)

Sinon tu groupe by idshk2

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

Mammouth du PHP | 725 Messages

10 janv. 2013, 03:14

j'ai mis un GROUP BY idshk2, mais le meme resultat:
         $SelSil = 'SELECT SUM(album_duration) as totalAlbumDuration FROM `shk_album` WHERE idshk2 = "'.$id_shk.'" GROUP BY idshk2';