par
jojolapine » 01 janv. 2009, 22:58
Bonsoir à tous,
Pardonnez mon titre peu explicite... mais je ne vois pas commetn expliquer le problème en trois mots
Je suis face à un petit problème... Un peu trop compliqué pour moi...
Pour une application intranet qui sert à compter les temps de fabrication des produits, je cherche à faire une requête un peu particulière...
Bon commençons par la structure des tables:
Code : Tout sélectionner
--
-- Structure de la table `actions`
--
CREATE TABLE IF NOT EXISTS `actions` (
`id_action` int(10) unsigned NOT NULL auto_increment,
`nom` varchar(50) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id_action`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=6 ;
-- --------------------------------------------------------
--
-- Structure de la table `actionsEmployes`
--
CREATE TABLE IF NOT EXISTS `actionsEmployes` (
`id_actionsEmployes` int(10) unsigned NOT NULL auto_increment,
`id_employe` int(10) unsigned NOT NULL,
`id_action` int(10) unsigned NOT NULL,
`date_debut` timestamp NOT NULL default '0000-00-00 00:00:00',
`date_fin` timestamp NOT NULL default '0000-00-00 00:00:00',
`BF` int(10) unsigned NOT NULL,
PRIMARY KEY (`id_actionsEmployes`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=8 ;
-- --------------------------------------------------------
--
-- Structure de la table `employes`
--
CREATE TABLE IF NOT EXISTS `employes` (
`id_employe` int(10) unsigned NOT NULL auto_increment,
`nom` varchar(50) collate utf8_unicode_ci NOT NULL,
`prenom` varchar(50) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id_employe`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
Le shéma des tables est assez simple, on a des employes, des actions diverses, dont certaines ont un numéro de BF...
Bon je souhaiterais pouvoir afficher tout les enregistrements dont la date de début est égale à celle d'aujourd'hui, et dont le date de fin n'est pas renseigné... ça c'est bon, mais je souhaiterais en plus lorsque que l'on a un enregistrement comportant un numéro de BF obtenir le temps total passé dessus (quelque soit la date...)
Et c'est là que je bloque, j'ai pas l'impression que ce soit possible uniquement en SQL?
Et si c'est en php, ça va faire de trop gros traitements...
Bon voici la requête actuelle qui fonctionne (sans la dernière fonctionnalité):
Code : Tout sélectionner
SELECT
ae.date_debut as date_debut,
e.nom as nomEmploye,
e.prenom as prenomEmploye,
ae.BF as BF,
a.nom as nomAction
FROM actionsEmployes as ae
JOIN employes as e ON ae.id_employe=e.id_employe
LEFT JOIN actions as a ON ae.id_action=a.id_action
WHERE DATE(date_debut)=CURDATE() AND ae.date_fin='0000-00-00 00:00:00'
et voici une requête qui calcul le temps total passé sur un BF donné
Code : Tout sélectionner
SELECT
TIME(SUM(TIMEDIFF(ae.date_fin,ae.date_debut))) as tempTotal,
ae.BF as BF
FROM actionsEmployes as ae
WHERE BF=245
Je ne sais pas s'il est possible d'imbriquer les deux étant donné que sur la première requête on filtre trop pour pouvoir faire nos sommes ensuite...
Voilà merci d'avance!!!
EDIT:
J'avance à tatons, voici ce que j'ai fait:
Code : Tout sélectionner
SELECT
ae.date_debut as date_debut,
TIME(SUM(TIMEDIFF(ae2.date_fin,ae2.date_debut))) as tempTotal,
e.nom as nomEmploye,
e.prenom as prenomEmploye,
ae.BF as BF,
a.nom as nomAction
FROM actionsEmployes as ae
JOIN employes as e ON ae.id_employe=e.id_employe
LEFT JOIN actions as a ON ae.id_action=a.id_action
JOIN actionsEmployes as ae2 ON ae2.BF<>0
WHERE DATE(ae.date_debut)=CURDATE() AND ae.date_fin='0000-00-00 00:00:00'
GROUP BY ae.id_actionsEmployes
Mais ça ne fonctionne pas, puisque tempTotal vaut le temps passé sur toutes les actions (avec ou sans BF...)
Je doute de plus de la faisabilité "tout SQL"...
D'autres idées?
EDIT2:
J'ai crier hourra! ... trop tôt

Alors voici une requête qui marche dans un cas spécifique:
Code : Tout sélectionner
SELECT ae.date_debut AS date_debut, TIME( SUM( TIMEDIFF( ae2.date_fin, ae2.date_debut ) ) ) AS tempsTotal, e.nom AS nomEmploye, e.prenom AS prenomEmploye, ae.BF AS BF, a.nom AS nomAction
FROM actionsEmployes AS ae
JOIN employes AS e ON ae.id_employe = e.id_employe
LEFT JOIN actions AS a ON ae.id_action = a.id_action
LEFT JOIN actionsEmployes AS ae2 ON ae2.BF = ae.BF AND ae2.date_fin<>\'0000-00-00 00:00:00\'
WHERE DATE( ae.date_debut ) = CURDATE( )
AND ae.date_fin = \'0000-00-00 00:00:00\'
GROUP BY ae.id_actionsEmployes
Elle fonctionne seulement quand la table ne contient qu'une seule entrée correspondante (C.a.d. même BF et date_fin renseignée)
Dès qu'il y en a plusieurs... pfioute... plus rien!
On se rapproche on se rapproche, mais cest de plus en plus flou pour moi!
Bonsoir à tous,
Pardonnez mon titre peu explicite... mais je ne vois pas commetn expliquer le problème en trois mots :lol:
Je suis face à un petit problème... Un peu trop compliqué pour moi...
Pour une application intranet qui sert à compter les temps de fabrication des produits, je cherche à faire une requête un peu particulière...
Bon commençons par la structure des tables:[code]--
-- Structure de la table `actions`
--
CREATE TABLE IF NOT EXISTS `actions` (
`id_action` int(10) unsigned NOT NULL auto_increment,
`nom` varchar(50) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id_action`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=6 ;
-- --------------------------------------------------------
--
-- Structure de la table `actionsEmployes`
--
CREATE TABLE IF NOT EXISTS `actionsEmployes` (
`id_actionsEmployes` int(10) unsigned NOT NULL auto_increment,
`id_employe` int(10) unsigned NOT NULL,
`id_action` int(10) unsigned NOT NULL,
`date_debut` timestamp NOT NULL default '0000-00-00 00:00:00',
`date_fin` timestamp NOT NULL default '0000-00-00 00:00:00',
`BF` int(10) unsigned NOT NULL,
PRIMARY KEY (`id_actionsEmployes`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=8 ;
-- --------------------------------------------------------
--
-- Structure de la table `employes`
--
CREATE TABLE IF NOT EXISTS `employes` (
`id_employe` int(10) unsigned NOT NULL auto_increment,
`nom` varchar(50) collate utf8_unicode_ci NOT NULL,
`prenom` varchar(50) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id_employe`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
[/code]
Le shéma des tables est assez simple, on a des employes, des actions diverses, dont certaines ont un numéro de BF...
Bon je souhaiterais pouvoir afficher tout les enregistrements dont la date de début est égale à celle d'aujourd'hui, et dont le date de fin n'est pas renseigné... ça c'est bon, mais je souhaiterais en plus lorsque que l'on a un enregistrement comportant un numéro de BF obtenir le temps total passé dessus (quelque soit la date...)
Et c'est là que je bloque, j'ai pas l'impression que ce soit possible uniquement en SQL?
Et si c'est en php, ça va faire de trop gros traitements...
Bon voici la requête actuelle qui fonctionne (sans la dernière fonctionnalité):[code]SELECT
ae.date_debut as date_debut,
e.nom as nomEmploye,
e.prenom as prenomEmploye,
ae.BF as BF,
a.nom as nomAction
FROM actionsEmployes as ae
JOIN employes as e ON ae.id_employe=e.id_employe
LEFT JOIN actions as a ON ae.id_action=a.id_action
WHERE DATE(date_debut)=CURDATE() AND ae.date_fin='0000-00-00 00:00:00'[/code]
et voici une requête qui calcul le temps total passé sur un BF donné[code]SELECT
TIME(SUM(TIMEDIFF(ae.date_fin,ae.date_debut))) as tempTotal,
ae.BF as BF
FROM actionsEmployes as ae
WHERE BF=245[/code]
Je ne sais pas s'il est possible d'imbriquer les deux étant donné que sur la première requête on filtre trop pour pouvoir faire nos sommes ensuite...
Voilà merci d'avance!!!
EDIT:
J'avance à tatons, voici ce que j'ai fait:[code]SELECT
ae.date_debut as date_debut,
TIME(SUM(TIMEDIFF(ae2.date_fin,ae2.date_debut))) as tempTotal,
e.nom as nomEmploye,
e.prenom as prenomEmploye,
ae.BF as BF,
a.nom as nomAction
FROM actionsEmployes as ae
JOIN employes as e ON ae.id_employe=e.id_employe
LEFT JOIN actions as a ON ae.id_action=a.id_action
JOIN actionsEmployes as ae2 ON ae2.BF<>0
WHERE DATE(ae.date_debut)=CURDATE() AND ae.date_fin='0000-00-00 00:00:00'
GROUP BY ae.id_actionsEmployes[/code]
Mais ça ne fonctionne pas, puisque tempTotal vaut le temps passé sur toutes les actions (avec ou sans BF...)
Je doute de plus de la faisabilité "tout SQL"...
D'autres idées?
EDIT2:
J'ai crier hourra! ... trop tôt :(
Alors voici une requête qui marche dans un cas spécifique:[code]SELECT ae.date_debut AS date_debut, TIME( SUM( TIMEDIFF( ae2.date_fin, ae2.date_debut ) ) ) AS tempsTotal, e.nom AS nomEmploye, e.prenom AS prenomEmploye, ae.BF AS BF, a.nom AS nomAction
FROM actionsEmployes AS ae
JOIN employes AS e ON ae.id_employe = e.id_employe
LEFT JOIN actions AS a ON ae.id_action = a.id_action
LEFT JOIN actionsEmployes AS ae2 ON ae2.BF = ae.BF AND ae2.date_fin<>\'0000-00-00 00:00:00\'
WHERE DATE( ae.date_debut ) = CURDATE( )
AND ae.date_fin = \'0000-00-00 00:00:00\'
GROUP BY ae.id_actionsEmployes[/code]
Elle fonctionne seulement quand la table ne contient qu'une seule entrée correspondante (C.a.d. même BF et date_fin renseignée)
Dès qu'il y en a plusieurs... pfioute... plus rien!
On se rapproche on se rapproche, mais cest de plus en plus flou pour moi!