PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 24-06-2010 10:56:29

athome
Membre
Inscription : 24-06-2010
Messages : 23

[MySQL] Compter sur deux tables

Bonjour, j'ai plusieurs soucis pour compter, trier et ranger...
J'ai donc deux tables

table1                   table2

id1 code1 categorie    id2 code2 groupe
1   001        a             1   001       1
2   002        b             2   002       1
3   003        c             3   003       1
4   004        d             4   004       2
5   005        e             5   005       2
6   006        b             6   006       2
7   007        a             7   007       3
8   008        a             8   008       3
9   009        c             9   009       3

je voudrais arriver à :

groupe categorie  nombre
   1       a         1
   2       a         0
   3       a         2

ce qui lie mes tables c'est le code

alors pour cette requete, je veux :
compter le nombre de 'categorie' dans chaque 'groupe'
grouper par 'groupe' smile
trier par l'id2'

et surtout afficher les zéro, des 'groupe'
n'ayant meme pas de 'categorie'
je veux savoir combien il y a de
categorie dans le groupe et s'il n'y en a pas afficher "0"

voici ce que j'ai fais pour l'instant

SELECT table2.groupe,
COUNT(table1.categorie) AS nombre
FROM table2, table1
WHERE table1.code=table2.code2 AND categorie = 'a'
GROUP BY table2.groupe
ORDER BY table2.id2 ASC

si vous pouviez me donner un coup de main wink
et s'il manque quelque chose, demandé moi

les CREATE TABLE

CREATE TABLE IF NOT EXISTS `table1` (
  `id1` int(11) NOT NULL auto_increment,
  `nom` text NOT NULL,
  `prenom` text NOT NULL,
  `categorie` text NOT NULL,
  `code1` text NOT NULL,
  PRIMARY KEY  (`id1`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

CREATE TABLE IF NOT EXISTS `table2` (
  `id2` int(11) NOT NULL auto_increment,
  `groupe` text NOT NULL,
  `code2` text NOT NULL,
  PRIMARY KEY  (`id2`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

et les INSERT INTO

INSERT INTO `table1` (`id1`,`nom`, `prenom`, `categorie`, `code1`) VALUES
(1, 'durant', 'andre', 'a', '001',),
(2, 'dupont', 'Jean', 'b', '002'),
(3, 'martin', 'Elodie', 'c', '003'),
(4, 'blanc', 'Dominique', 'd', '004'),
(5, 'rouge', 'Monique', 'e', '005'),
(6, 'vert', 'Francois', 'b', '006'),
(7, 'bleu', 'Fabien', 'a',  '007'),
(8, 'noir', 'Jean', 'a', '008'),
(9, 'blanc', 'Marie', 'c', '009'),

INSERT INTO `table2` (`id2`, `groupe`, `code2`) VALUES
(1, '1', '001'),
(2, '1', '002'),
(3, '1', '003'),
(4, '2', '004'),
(5, '2', '005'),
(6, '2', '006'),
(7, '3', '007'),
(8, '3', '008'),
(9, '3', '009'),

Hors ligne

#2 24-06-2010 14:39:00

athome
Membre
Inscription : 24-06-2010
Messages : 23

Re : [MySQL] Compter sur deux tables

Voici la réponse pour information

SELECT groupe, (SELECT COUNT(categorie) FROM table1 WHERE categorie='a' AND id1=id2) AS cat
FROM table2 t2
GROUP BY groupe

Hors ligne

#3 25-06-2010 12:09:33

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : [MySQL] Compter sur deux tables

Saluton,
Surement pas !
Il faut faire une jointure externe (LEFT OUTER JOIN) entre les deux tables sur les colonnes code1 et code2.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#4 25-06-2010 13:00:34

athome
Membre
Inscription : 24-06-2010
Messages : 23

Re : [MySQL] Compter sur deux tables

en fait je joins bien les code1 et code2

et j'arrive bien au résultat que je souhaitais !

Hors ligne

#5 25-06-2010 13:05:17

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : [MySQL] Compter sur deux tables

Ce que veux dire Kris c'est que ce que tu fais n'est pas assez propre à son goût. ^^

Hors ligne

#6 25-06-2010 13:14:32

athome
Membre
Inscription : 24-06-2010
Messages : 23

Re : [MySQL] Compter sur deux tables

ah neutral

ah bah dans ce cas j'attends une proposition
pour comparer wink

Hors ligne

#7 25-06-2010 13:23:51

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : [MySQL] Compter sur deux tables

Ce n'est pas une question de propreté, c'est avant tout une question de performances et de respect de la norme SQL 92, qui a donc déjà 18 ans.
Les sous-requêtes ne constituent pas le point fort de MySQL, il vaut donc toujours mieux essayer de les remplacer par leur équivalent en jointures.
Parvenir au résultat escompté est un critère nécessaire mais insuffisant.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#8 25-06-2010 13:35:36

athome
Membre
Inscription : 24-06-2010
Messages : 23

Re : [MySQL] Compter sur deux tables

alors là je suis tout à fait d'accord avec toi
mais j'avoue que je n'ai surement pas le niveau requis
et malheureusement, c'est une requete qui me convient
mais si tu me proposes une requete à la norme et performante
je serais content de la tester et de pouvoir en apprendre un peu plus

Hors ligne

#9 25-06-2010 14:01:49

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : [MySQL] Compter sur deux tables

Si j'ai bien compris ta problématique je te propose ceci

SELECT groupe,
       t3.categorie,
       COUNT(t1.categorie) AS cat
FROM table2 t2,
(SELECT DISTINCT categorie FROM table2) AS t3,
LEFT OUTER JOIN table1 t1
    ON code1=code2
    AND t3.categorie=t1.categorie
GROUP BY groupe,t3.categorie

qui fait un produit cartésien entre table2 et l'ensemble des catégories puis compte, par jointure avec t1, leur fréquence d'apparition dans chaque groupe.
Je n'ai pas testé...


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#10 25-06-2010 14:49:51

athome
Membre
Inscription : 24-06-2010
Messages : 23

Re : [MySQL] Compter sur deux tables

ok merci par contre c'est au niveau de l'affichage que ça coince maintenant !

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in C:\wamp\www\test\sitnum5.php on line 68

<?php
while ($row_0102 = mysql_fetch_assoc($requete_0102)) {
          echo '<tr><td>',$row_0102['cat'],'</td></tr>';
          } ?>

Hors ligne

#11 25-06-2010 15:09:27

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : [MySQL] Compter sur deux tables

Je t'ai dit que je n'avais pas testé, et tu exploites directement le résultat sans le tester dans PhpMyAdmin, par exemple.
Si la requête plante ou ne retourne pas de résultat, $requete_0102 n'est pas une ressource utilisable par mysql_fetch_assoc()


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#12 25-06-2010 15:14:46

athome
Membre
Inscription : 24-06-2010
Messages : 23

Re : [MySQL] Compter sur deux tables

exact il y a déjà une erreur dans PhpMyAdmin

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT OUTER JOIN table1 t1 ON code1=code2 AND t3.' at line 6

Hors ligne

#13 25-06-2010 18:17:06

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : [MySQL] Compter sur deux tables

En fait, c'est un peu plus compliqué

SELECT groupe,
       t3.categorie,
       COUNT(t1.categorie) AS cat
FROM (SELECT * FROM table2, (SELECT DISTINCT categorie FROM table1) t4) AS t3
      LEFT OUTER JOIN table1 t1
            ON code1=code2
            AND t3.categorie=t1.categorie
GROUP BY groupe,t3.categorie

Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#14 01-07-2010 15:55:49

athome
Membre
Inscription : 24-06-2010
Messages : 23

Re : [MySQL] Compter sur deux tables

Merci ça fonctionne bien mais cela me donne toutes les categorie
j'ai essayé de placer un WHERE categorie='a' mais erreur !

Dernière modification par athome (01-07-2010 16:03:01)

Hors ligne

#15 01-07-2010 16:14:40

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : [MySQL] Compter sur deux tables

athome a écrit :

... pour cette requete, je veux :
compter le nombre de 'categorie' dans chaque 'groupe'
grouper par 'groupe' smile
trier par l'id2'

et surtout afficher les zéro, des 'groupe'
n'ayant meme pas de 'categorie'
je veux savoir combien il y a de
categorie dans le groupe et s'il n'y en a pas afficher "0"

Tel était, me semble-t'il, le cahier des charges initial.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#16 01-07-2010 16:25:11

athome
Membre
Inscription : 24-06-2010
Messages : 23

Re : [MySQL] Compter sur deux tables

effectivement, mais j'avais aussi indiqué un résultat ressemblant à ceci :

groupe categorie  nombre
   1       a         1
   2       a         0
   3       a         2

et le "trier par l'id2" je l'ai fait avec un ORDER BY
je pensais faire de meme avec un WHERE t3.categorie = 'a' mais soi
j'ai une erreur, soit il ne me sort plus que les groupe ayant cette catégorie !

Hors ligne

#17 01-07-2010 19:36:21

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : [MySQL] Compter sur deux tables

Ta question démontre que tu n'essayes même pas de comprendre la logique de cette requête

SELECT groupe,
     t3.categorie,
     COUNT(t1.categorie) AS cat
FROM (SELECT * FROM table2, (SELECT DISTINCT categorie FROM table1) t4) AS t3
    LEFT OUTER JOIN table1 t1
          ON code1=code2
          AND t3.categorie=t1.categorie
GROUP BY groupe,t3.categorie
HAVING t3.categorie='a'

Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#18 05-07-2010 08:42:53

athome
Membre
Inscription : 24-06-2010
Messages : 23

Re : [MySQL] Compter sur deux tables

ok, merci de ta remarque et de ta requête qui fonctionne très bien smile

Hors ligne

Pied de page des forums