Page 1 sur 2

Probleme sur requete de comptage

Posté : 25 nov. 2006, 16:19
par azimut2000
Bonjour,

Je bute sur un gros problème avec MySQL...
J'ai monté une base de donnée ou je stocke dans diverses colonnes, des données qui peuvent être les mêmes (Ex: voiture). Sur chaque ligne, je peux avoir plusieurs articles de même sorte..

Mon problème est le suivant: j'ai besoin de calculer entre 2 dates, le nombre d'article enregistré, sachant que sur chaque ligne, il faut ajouter 1 article en plus et faire la somme de tous les articles trouvés dans les différentes colonnes.

Ca doit être facile pour certain, mais en SQL, je suis plutôt débutant et même avec les tutos trouvés sur Internet, je n'arrive pas à faire quelque chose de correct.
Alors si quelqu'un a une idée sur la manière de faire, n'hésitez pas !
Merci.

Merci de votre aide à tous...

Thierry

Posté : 25 nov. 2006, 16:32
par Truc
Salut,
Tu es invité à aller lire les règlements du forum qui précisent bien que le crossposting n'est absolument pas apprécié !!

Surtout que tu as déjà eu une réponse dans le forum mysql.ifrance.com avant que tu ne repostes ici :evil:

Posté : 25 nov. 2006, 16:33
par albat
Peux-tu nous donner la structure exacte de ta table ?
Et éventuellement un échantillon de données ?

Posté : 26 nov. 2006, 15:21
par azimut2000
Désolé "Truc", mais je n'avais pas eu de réponse et je dois rendre ma copie pour mardi ! J'ai essayé au départ de me débrouiller seul, mais voyant la date arriver, je me suis - un peu tard - décidé à lancer une demande d'aide.
J'ai donc, effectivement posé ma question sur 2 forums :oops:
Peux-tu nous donner la structure exacte de ta table ?
Et éventuellement un échantillon de données ?
J'ai une base, dans laquelle j'ai 2 tables (1 définissant les "utilisateurs" & une autre ou sont stocké les "données" enregistré par les utilisateurs).
Dans la table "donnée", j'ai environ 60 champs... dans chaque champs, on peut enregistrer des données identiques; c'est a dire que sur la même ligne d'enregistrement, je vais pouvoir avoir la donnée "voiture" ou "décodeur" sur plusieurs champs. Parmi les champs, on a également un champ date qui me permet de connaître le jour de l'enregistrement.

Maintenant, je souhaite simplement, calculer le nombre de "décodeur" situé entre 2 dates... sachant qu'en plus, je dois ajouter dans mon calcul,
1 décodeur de plus sur chaque ligne. Ce qui se résume par la formule:

Code : Tout sélectionner

(Nbr_Decodeur_sur _ligne1 + 1)+(Nbr_Decodeur_sur _ligne2 + 1)+...+(Nbr_Decodeur_sur _ligneN + 1) situé entre la date1 & la date2
J'ai beau triturer MySQL de tous les cotés, je n'arrive pas à réaliser l'opération. On m'a dit qu'avec SQL on pouvait faire cela, mais je commence à douter...

Posté : 26 nov. 2006, 17:27
par Ajoloca
Désolé "Truc", mais je n'avais pas eu de réponse et je dois rendre ma copie pour mardi ! J'ai essayé au départ de me débrouiller seul, mais voyant la date arriver, je me suis - un peu tard - décidé à lancer une demande d'aide.
J'ai donc, effectivement posé ma question sur 2 forums :oops:
Je suis désolé de te contredire mais j'ai répondu personnellement à ton post sur l'autre site en te demandant exactement que te demande Albat
Tu n'as jamais donné suite à mes questions.

Je constate que ici tu réponds au post, mais toujours pas aux questions.
Si toi tu connais tes tables, nous ici, nous n'avons pas la chance d'avoir des boules de cristal.

Posté : 26 nov. 2006, 17:30
par albat
nous n'avons pas la chance d'avoir des boules de cristal.
Pas les miennes, en tout cas.

suis plus là !!! :-*

Posté : 26 nov. 2006, 19:50
par azimut2000

Je constate que ici tu réponds au post, mais toujours pas aux questions.
Si toi tu connais tes tables, nous ici, nous n'avons pas la chance d'avoir des boules de cristal.
Que voulez vous ?
Je peux vous envoyer la base pour bien comprendre, mais ça va faire un peu gros pour le forum :)
Pis, je suis pas un pro de l'utilisation de ces forums... On m'avait conseillé de venir poser ma question sur 2/3 sites spécialisés, mais je vois que je les personnes qui y sont, ne semblent pas très partageur de leur connaissances !
Je suis désolé si je n'ai pas respecté les conditions, désolé si je répond que sur CE forum, désolé si je ne mets pas plus de choses, désolé si je choque car je m'y prend certainement mal... Mais en même temps, je ne sais pas ce qu'il vous faut exactement pour répondre ??? Je pensait qu'en expliquant simplement ce que je souhaitait faire pouvait suffire, maintenant, je vois qu'il faut livrer la base entière.
Un peu déçu...
M'enfin, maintenant, s'il reste quelques ames charitables, je suis preneur de conseils pour un pauvre mec qui essai de se mettre à PHP & surtout à MySQL et au SQL tout simplement...

Thierry

Posté : 26 nov. 2006, 20:01
par Ajoloca
Re,
Si je relis tous les post concernant ta demande, la seule fois ou je trouve "la base entière" c'est sur ton dernier.

Si tu ne sais pas comment obtenir ce qu'on te demande (la structure d'une table et extraire quelques données de celle-ci), demande.

Pour obtenir la structure d'une table

Code : Tout sélectionner

DESCRIBE nom_table;
Pour obtenir un certain nombre d'enregistrements

Code : Tout sélectionner

SELECT * FROM nom_table LIMIT n, m;
Où n représente le Nº de l'enrgistrement de départ et m le nombre d'enregistrements à extraire.

Posté : 26 nov. 2006, 20:02
par albat
je ne sais pas ce qu'il vous faut exactement pour répondre ??? (...)
maintenant, je vois qu'il faut livrer la base entière.
Ah bon ? :shock:

Tu as dû mal me lire, alors...
Peux-tu nous donner la structure exacte de ta table ?
Et éventuellement un échantillon de données ?

Posté : 27 nov. 2006, 02:05
par azimut2000
Re,
Si je relis tous les post concernant ta demande, la seule fois ou je trouve "la base entière" c'est sur ton dernier.

Si tu ne sais pas comment obtenir ce qu'on te demande (la structure d'une table et extraire quelques données de celle-ci), demande.

Pour obtenir la structure d'une table

Code : Tout sélectionner

DESCRIBE nom_table;
Pour obtenir un certain nombre d'enregistrements

Code : Tout sélectionner

SELECT * FROM nom_table LIMIT n, m;
Où n représente le Nº de l'enrgistrement de départ et m le nombre d'enregistrements à extraire.
C'est cela que vous souhaitez avoir ?

Code : Tout sélectionner

CREATE TABLE `client` ( `id` int(11) NOT NULL, `NomClient` text NOT NULL, `ND` text NOT NULL, `DateInstall` date NOT NULL, `NbrTVHD` tinyint(4) NOT NULL, `NbrTVSD` tinyint(4) NOT NULL, `NbrPCFixe` tinyint(4) NOT NULL, `NbrPCPortable` tinyint(4) NOT NULL, `NbrLive` tinyint(4) NOT NULL, `NbrLiveM` tinyint(4) NOT NULL, `TypInstall` text NOT NULL, `Type` text NOT NULL, `PuissRecu` text NOT NULL, `PuissEmise` text NOT NULL, `LongEthernet` text NOT NULL, `AdresseMAC` text NOT NULL, `NumSerieONT` text NOT NULL, `DescriptionPassage` text NOT NULL, `Lieu` text NOT NULL, `Info` text NOT NULL, `LieuLB` text NOT NULL, `InfoLB` text NOT NULL, `HTache1a` time NOT NULL, `HTache1b` time NOT NULL, `HTache2a` time NOT NULL, `HTache2b` time NOT NULL, `nbr1` tinyint(4) NOT NULL, `nbr2` tinyint(4) NOT NULL, `CnxTVHD1` text NOT NULL, `BouquetHD1` text NOT NULL, `LieuTVHD1` text NOT NULL, `TVHD1` text NOT NULL, `CnxTVHD2` text NOT NULL, `BouquetHD2` text NOT NULL, `LieuTVHD2` text NOT NULL, `TVHD2` text NOT NULL, `CnxTVHD3` text NOT NULL, `BouquetHD3` text NOT NULL, `LieuTVHD3` text NOT NULL, `TVHD3` text NOT NULL, `CnxTVHD4` text NOT NULL, `BouquetHD4` text NOT NULL, `LieuTVHD4` text NOT NULL, `TVHD4` text NOT NULL, `CnxTVHD5` text NOT NULL, `BouquetHD5` text NOT NULL, `LieuTVHD5` text NOT NULL, `TVHD5` text NOT NULL, `CnxTVSD1` text NOT NULL, `BouquetSD1` text NOT NULL, `LieuTVSD1` text NOT NULL, `TVSD1` text NOT NULL, `CnxTVSD2` text NOT NULL, `BouquetSD2` text NOT NULL, `LieuTVSD2` text NOT NULL, `TVSD2` text NOT NULL, `CnxTVSD3` text NOT NULL, `BouquetSD3` text NOT NULL, `LieuTVSD3` text NOT NULL, `TVSD3` text NOT NULL, `CnxTVSD4` text NOT NULL, `BouquetSD4` text NOT NULL, `LieuTVSD4` text NOT NULL, `TVSD4` text NOT NULL, `CnxTVSD5` text NOT NULL, `BouquetSD5` text NOT NULL, `LieuTVSD5` text NOT NULL, `TVSD5` text NOT NULL, `CnxFixe1` text NOT NULL, `fixe1` text NOT NULL, `LieuPCFixe1` text NOT NULL, `FIX1` text NOT NULL, `CnxFixe2` text NOT NULL, `fixe2` text NOT NULL, `LieuPCFixe2` text NOT NULL, `FIX2` text NOT NULL, `CnxFixe3` text NOT NULL, `fixe3` text NOT NULL, `LieuPCFixe3` text NOT NULL, `FIX3` text NOT NULL, `CnxFixe4` text NOT NULL, `fixe4` text NOT NULL, `LieuPCFixe4` text NOT NULL, `FIX4` text NOT NULL, `CnxFixe5` text NOT NULL, `fixe5` text NOT NULL, `LieuPCFixe5` text NOT NULL, `FIX5` text NOT NULL, `CnxPortable1` text NOT NULL, `portable1` text NOT NULL, `LieuPortable1` text NOT NULL, `POR1` text NOT NULL, `CnxPortable2` text NOT NULL, `portable2` text NOT NULL, `LieuPortable2` text NOT NULL, `POR2` text NOT NULL, `CnxPortable3` text NOT NULL, `portable3` text NOT NULL, `LieuPortable3` text NOT NULL, `POR3` text NOT NULL, `CnxPortable4` text NOT NULL, `portable4` text NOT NULL, `LieuPortable4` text NOT NULL, `POR4` text NOT NULL, `CnxPortable5` text NOT NULL, `portable5` text NOT NULL, `LieuPortable5` text NOT NULL, `POR5` text NOT NULL, `CnxLiveM1` text NOT NULL, `TypeLiveM1` text NOT NULL, `LieuLiveM1` text NOT NULL, `ZIK1` text NOT NULL, `CnxLiveM2` text NOT NULL, `TypeLiveM2` text NOT NULL, `LieuLiveM2` text NOT NULL, `ZIK2` text NOT NULL, `CnxLiveM3` text NOT NULL, `TypeLiveM3` text NOT NULL, `LieuLiveM3` text NOT NULL, `ZIK3` text NOT NULL, `CnxLiveM4` text NOT NULL, `TypeLiveM4` text NOT NULL, `LieuLiveM4` text NOT NULL, `ZIK4` text NOT NULL, `CnxLiveM5` text NOT NULL, `TypeLiveM5` text NOT NULL, `LieuLiveM5` text NOT NULL, `ZIK5` text NOT NULL, `CnxLive1` text NOT NULL, `TypeLive1` text NOT NULL, `LieuLive` text NOT NULL, `CAM1` text NOT NULL, `CnxLive2` text NOT NULL, `TypeLive2` text NOT NULL, `LieuLive2` text NOT NULL, `CAM2` text NOT NULL, `CnxLive3` text NOT NULL, `TypeLive3` text NOT NULL, `LieuLive3` text NOT NULL, `CAM3` text NOT NULL, `CnxLive4` text NOT NULL, `TypeLive4` text NOT NULL, `LieuLive4` text NOT NULL, `CAM4` text NOT NULL, `CnxLive5` text NOT NULL, `TypeLive5` text NOT NULL, `LieuLive5` text NOT NULL, `CAM5` text NOT NULL, `TIC` text character set armscii8 NOT NULL, `Dpt` int(5) default NULL, `SAV` longtext character set armscii8, `Prod` longtext character set armscii8 NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Dans tous les champs qui commencent par "Cnx", je peux avoir les données suivantes: "CPL", "Ethernet" ou "Wifi".
Donc, pour le même enregistrement, un ou plusieurs champs "Cnx" peuvent etre non NULL; s'ils le sont, je veux savoir combien de fois le mot "CPL" apparaît et ajouter 1 unité à chaque fois. Ensuite, ce calcul étant pour une seule ligne "datée", je veux savoir la même chose, mais sur plusieurs lignes définie et comprises entre 2 dates...

Posté : 27 nov. 2006, 02:18
par DocType
Wahou
Oui, apparemment c'est cela qu'il recherche. Maintenant, soit ça les fait sauter au plafond, soit pas. Moi perso ça me fait sauter très haut ! J'aurai plutôt utilisé des bases liées en essyant d'utiliser des CHAR plutôt que des text...
Enfin, A vot' bon coeur les copains ViPHP :wink:
(poste tout de même une explication plus large de la base, ce que ça peut contenir etc....un exemple concret...ou echantillon comme Albat et Ajoloca ont également demandé :wink: )

Posté : 27 nov. 2006, 02:35
par Ajoloca
Wahou
Oui, apparemment c'est cela qu'il recherche. Maintenant, soit ça les fait sauter au plafond, soit pas. Moi perso ça me fait sauter très haut ! J'aurai plutôt utilisé des bases liées en essyant d'utiliser des CHAR plutôt que des text...
Enfin, A vot' bon coeur les copains ViPHP :wink:
(poste tout de même une explication plus large de la base, ce que ça peut contenir etc....un exemple concret...ou echantillon comme Albat et Ajoloca ont également demandé :wink: )
Perso je me range de ton coté.
J'ai troué le plaffond, et du InnoDB en prime. Mort au relationnel !!!

Posté : 27 nov. 2006, 02:37
par DocType
Perso je me range de ton coté.
J'ai troué le plaffond, et du InnoDB en prime. Mort au relationnel !!!
Je crains que la nuit te soit rude Ajoloca. Un somnifère s'impose je pense :lol:
Moi mon coeur s'est emballé en voyant cela, c'est encore pire que le pire que j'ai pu voir :lol:
Bon allez hop, moi j'y vais avant de devoir prendre le somnifère ^^
++ bonne nuit Ajo'

Posté : 27 nov. 2006, 02:39
par Ajoloca
Thanks, @+

Posté : 27 nov. 2006, 07:40
par Cyrano
Reprenons le sujet. Azimut2000, il y a un grave problème de conception dans ce modèle. Pour illustrer ce qu'à voulu dire LHDN92 à propos de tables liées (et non de bases liées du reste), je t'invite à jeter un coup d'oeil sur ceci. Applique le principe exposé pour revoir la construction de ta table, tu auras des performance très nettement améliorées.

Un des principes fondamentaux lors de la modélisation d'une base de données : éviter autant que faire se peut les champs NULL et les redondances. Certains types de données sont multipliées dans ta table actuelles "aux cas où", pour certaines lignes (seulement), tu aurais de quoi les remplir. Essaye de voir comment améliorer ça.