Probleme sur requete de comptage

Petit nouveau ! | 5 Messages

25 nov. 2006, 16:19

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

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

25 nov. 2006, 16:32

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:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

25 nov. 2006, 16:33

Peux-tu nous donner la structure exacte de ta table ?
Et éventuellement un échantillon de données ?

Petit nouveau ! | 5 Messages

26 nov. 2006, 15:21

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...

ViPHP
ViPHP | 1961 Messages

26 nov. 2006, 17:27

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.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

26 nov. 2006, 17:30

nous n'avons pas la chance d'avoir des boules de cristal.
Pas les miennes, en tout cas.

suis plus là !!! :-*

Petit nouveau ! | 5 Messages

26 nov. 2006, 19:50


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

ViPHP
ViPHP | 1961 Messages

26 nov. 2006, 20:01

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.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

26 nov. 2006, 20:02

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 ?

Petit nouveau ! | 5 Messages

27 nov. 2006, 02:05

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...

Mammouth du PHP | 1776 Messages

27 nov. 2006, 02:18

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: )

ViPHP
ViPHP | 1961 Messages

27 nov. 2006, 02:35

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 !!!
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 1776 Messages

27 nov. 2006, 02:37

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'

ViPHP
ViPHP | 1961 Messages

27 nov. 2006, 02:39

Thanks, @+
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 19672 Messages

27 nov. 2006, 07:40

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: