Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/12/2010, 10h39   #1
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 707
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 707
Points : 328
Points : 328
Par défaut count() et group by

Bonjour,
J'ai 2 tables :
  • table albums (id, titre)
  • table titres (id, titre, album_id)
Je souhaite avoir le nombre de titres par album ?
Comment le faire?

Merci d'avance...
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 10h44   #2
Membre chevronné
 
Inscription : juillet 2003
Messages : 625
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 625
Points : 600
Points : 600
Bonjour,

je l'ai pas testée mais ça devrait s'en approcher

Code :
1
2
3
 
SELECT COUNT(titres.id), albums.titre FROM albums 
INNER JOIN titres ON titres.album_id = albums.id GROUP BY albums.titre
http://sqlpro.developpez.com/cours/sqlaz/ensembles/#L1
__________________
Le savoir est utile que s'il est partagé par tous.
/(bb|[^b]{2})/
!sleep() ? array((string))
syl2095 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 12h23   #3
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Bonjour,

personnellement, vu qu'un album contient n titres et qu'un titre peut se trouver dans n albums, j'aurais fait une table de jonction avec en clé primaire l'association des clés étrangères album_id et titre_id et l'attribut titre

intérêt : garantir l'intégrité
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 11h40   #4
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 707
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 707
Points : 328
Points : 328
Citation:
Envoyé par Madfrix Voir le message
Bonjour,

personnellement, vu qu'un album contient n titres et qu'un titre peut se trouver dans n albums, j'aurais fait une table de jonction avec en clé primaire l'association des clés étrangères album_id et titre_id et l'attribut titre

intérêt : garantir l'intégrité
Dans ce cas, une idée de la requête folle furieuse?

Merci d'avance...
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 12h48   #5
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Quelque chose comme ca :

les tables :
Code :
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
 
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
 
CREATE TABLE IF NOT EXISTS `albums` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `titre` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
 
 
INSERT INTO `albums` (`id`, `titre`) VALUES
(1, 'titre_album_1'),
(2, 'titre_album_2'),
(3, 'titre_album_3');
 
CREATE TABLE IF NOT EXISTS `album_titres` (
  `album_id_fk` int(11) NOT NULL,
  `titre_id_fk` int(11) NOT NULL,
  PRIMARY KEY (`album_id_fk`,`titre_id_fk`),
  KEY `fk_titre` (`titre_id_fk`),
  KEY `fk_album` (`album_id_fk`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
 
 
INSERT INTO `album_titres` (`album_id_fk`, `titre_id_fk`) VALUES
(1, 1),
(2, 1),
(1, 2),
(1, 3),
(2, 4),
(1, 5),
(3, 5),
(3, 6),
(1, 7),
(3, 7),
(3, 8),
(1, 9),
(2, 9),
(3, 9),
(2, 10),
(3, 10);
 
 
CREATE TABLE IF NOT EXISTS `titres` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `titre` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
 
 
INSERT INTO `titres` (`id`, `titre`) VALUES
(1, 'titre1'),
(2, 'titre2'),
(3, 'titre3'),
(4, 'titre4'),
(5, 'titre5'),
(6, 'titre6'),
(7, 'titre7'),
(8, 'titre8'),
(9, 'titre9'),
(10, 'titre10');
 
 
ALTER TABLE `album_titres`
  ADD CONSTRAINT `album_titres_ibfk_3` FOREIGN KEY (`album_id_fk`) REFERENCES `albums` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `album_titres_ibfk_4` FOREIGN KEY (`titre_id_fk`) REFERENCES `titres` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

La requête
Code sql :
1
2
3
4
5
6
7
 
SELECT albums.titre, COUNT(*) AS nb_titres FROM albums
INNER JOIN album_titres 
ON album_titres.album_id_fk = albums.id
INNER JOIN titres
ON album_titres.titre_id_fk = titres.id
GROUP BY albums.titre

Citation:
titre_album_1 6
titre_album_2 4
titre_album_3 6
Et voilà ton intégrité est respectée et cerise sur le gateau, le moteur innoDb te met à jour la table album_titres si tu supprime/update les tables albums et titres

PS: crée la table album_titres en dernier dans ta base
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2010, 08h34   #6
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 707
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 707
Points : 328
Points : 328
Merci, je teste et reviens à vous les maîtres...
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2010, 15h10   #7
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 707
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 707
Points : 328
Points : 328
Sur meme principe, j'ai fait cette requette :
Code :
1
2
3
4
5
6
7
 
SELECT styles.libelle, COUNT(*) AS nb_albums FROM styles
INNER JOIN album_styles 
ON album_styles.style = styles.id
INNER JOIN albums
ON album_styles.album = albums.id
GROUP BY styles.libelle
Elle marche bien, mais je n'ai pas les libellés des styles (styles.libelle) dont les nb_albums est égal à 0.

Comment afficher tous mes libellés meme ceux qui ne sont liés à aucun album donc 0 pour le cas.

Merci d'avance..
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2010, 20h51   #8
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Il te faut faire des jointures LEFT ou RIGHT selon le cas.

De la lecture
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2010, 20h52   #9
Membre Expert
 
Inscription : avril 2006
Messages : 1 338
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2006
Messages : 1 338
Points : 1 315
Points : 1 315
Citation:
Envoyé par okoweb Voir le message
Sur meme principe, j'ai fait cette requette :
Code :
1
2
3
4
5
6
7
 
SELECT styles.libelle, COUNT(*) AS nb_albums FROM styles
INNER JOIN album_styles 
ON album_styles.style = styles.id
INNER JOIN albums
ON album_styles.album = albums.id
GROUP BY styles.libelle
Elle marche bien, mais je n'ai pas les libellés des styles (styles.libelle) dont les nb_albums est égal à 0.

Comment afficher tous mes libellés meme ceux qui ne sont liés à aucun album donc 0 pour le cas.

Merci d'avance..
Code :
1
2
3
4
5
6
7
SELECT styles.libelle, COUNT(*) AS nb_albums FROM styles
LEFT JOIN album_styles 
ON album_styles.style = styles.id
INNER JOIN albums
ON album_styles.album = albums.id
GROUP BY styles.libelle
il me semble que ca sera bon comme ça
__________________
Stay in Bed .. Save Energy
boo64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2010, 20h54   #10
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
En effet
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 08h44   #11
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 707
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 707
Points : 328
Points : 328
Code :
1
2
3
4
5
6
7
 
SELECT styles.libelle, COUNT(*) AS nb_albums FROM styles
LEFT JOIN album_styles 
ON album_styles.style = styles.id
LEFT JOIN albums
ON album_styles.album = albums.id
GROUP BY styles.libelle
Ceci me retoune déjà tous les styles.libelle mais ceux qui ont 0 nb_albums, leur nb_albums maintenant est 1. Ce qui est faux.
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 09h45   #12
Membre Expert
 
Inscription : avril 2006
Messages : 1 338
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : avril 2006
Messages : 1 338
Points : 1 315
Points : 1 315
Essaye comme ça
Code :
1
2
3
4
5
6
SELECT styles.libelle, COUNT(albums.titre) AS nb_albums FROM styles
LEFT JOIN album_styles 
ON album_styles.style = styles.id
INNER JOIN albums
ON album_styles.album = albums.id
GROUP BY styles.libelle
__________________
Stay in Bed .. Save Energy
boo64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 18h24   #13
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 707
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 707
Points : 328
Points : 328
Citation:
Envoyé par boo64 Voir le message
Essaye comme ça
Code :
1
2
3
4
5
6
SELECT styles.libelle, COUNT(albums.titre) AS nb_albums FROM styles
LEFT JOIN album_styles 
ON album_styles.style = styles.id
INNER JOIN albums
ON album_styles.album = albums.id
GROUP BY styles.libelle
Voici ce que j'ai comme résultat.

Citation:
libelle nb_albums
Jazz 3
Urban music 2
World music 3
Les autres styles n'étant liés à aucun album n'apparaissent pas.
NB. J'exécute cette requete depuis PhpMyAdmin.

Merci d'avance...
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 20h49   #14
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Citation:
Envoyé par okoweb Voir le message
Merci d'avance...
Et si tu te documentais un peu au lieu d'attendre les réponses ?

Lis le lien sur les jointures que je t'ai fourni, tu comprendras pourquoi
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2010, 06h46   #15
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 707
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 707
Points : 328
Points : 328
Merci pour la doc.
Il fallait faire :

Code :
1
2
3
4
5
 
//LEFT JOIN
SELECT styles.libelle, COUNT( album_styles.style ) AS nb_albums FROM styles
LEFT JOIN album_styles ON album_styles.style = styles.id
GROUP BY styles.libelle
ou

Code :
1
2
3
4
5
 
//RIGHT JOIN
SELECT styles.libelle, COUNT( album_styles.style ) AS nb_albums FROM album_styles
RIGHT JOIN styles ON album_styles.style = styles.id
GROUP BY styles.libelle
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2010, 07h04   #16
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 707
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 707
Points : 328
Points : 328
Est-il possible de réunir les 2 requêtes ci-dessous en une seule unique pour avoir le nombre d'albums et le nombre de titres par style.

1. Nombre d'albums par style
Code :
1
2
3
4
 
SELECT styles.libelle, COUNT( album_styles.style ) AS nb_albums FROM styles
LEFT JOIN album_styles ON album_styles.style = styles.id
GROUP BY styles.libelle
2. Nombre de titres par style
Code :
1
2
3
4
 
SELECT styles.libelle, COUNT( titre_styles.titre ) AS nb_titres FROM styles
LEFT JOIN titre_styles ON titre_styles.titre = styles.id
GROUP BY styles.libelle
J'ai fait ceci, le résultat n'est pas bon
Code :
1
2
3
4
5
 
SELECT styles.libelle, COUNT( album_styles.style ) AS nb_albums, COUNT( titre_styles.titre ) AS nb_titres FROM styles
LEFT JOIN album_styles ON album_styles.style = styles.id
LEFT JOIN titre_styles ON titre_styles.titre = styles.id
GROUP BY styles.libelle
Merci d'avance...
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2010, 16h31   #17
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 707
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 707
Points : 328
Points : 328
Je suppose que ce n'est pas possible?
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h26.


 
 
 
 
Partenaires

Hébergement Web