Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels 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 27/09/2011, 16h58   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 47
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 47
Points : 12
Points : 12
Par défaut Création d'une requête d'activité par tranche horaire

Bonjour à tous,

Je cherche à créer une requête qui sélectionne le nombre d’occurrences de trois activités sur une tranche horaire donnée, et ce sur une journée.

Basiquement, voilà comment je récupère les trois activités sur une seule tranche horaire :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT 	COUNT(DATEHEURE_VAL_TEC) AS 'VAL_TEC_HORAIRE'
FROM delaitraite
WHERE CHAP='SANG_LOCAL' AND TIME(DATEHEURE_VAL_TEC) BETWEEN '00:00' AND '01:00'
 
UNION
 
SELECT 	COUNT(DATEHEURE_VAL_BIO) AS 'VAL_BIO_HORAIRE'
FROM delaitraite
WHERE CHAP='SANG_LOCAL' AND TIME(DATEHEURE_VAL_BIO) BETWEEN '00:00' AND '01:00'
 
UNION
 
SELECT 	COUNT(DATEHEURE_VAL_PVT) AS 'VAL_PVT_HORAIRE'
FROM delaitraite
WHERE CHAP='SANG_LOCAL' AND TIME(DATEHEURE_VAL_PVT) BETWEEN '00:00' AND '01:00'
Comme vous pouvez le voir, la requête va être énorme !
De plus, je vais devoir filtrer le tout, c'est à dire quelque chose comme ça :

Code :
1
2
3
4
5
6
7
8
9
10
 
(
(MES 3 ACTIVITÉS ENTRE 00h et 01h)
UNION
(MES 3 ACTIVITÉS ENTRE 01h et 02h)
UNION
....
(MES 3 ACTIVITÉS ENTRE 23h et 00h)
)
WHERE Option1=Blablabla AND Option2=Blablabla...etc

Auriez-vous une solution plus optimale ?
Logarithmix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 17h23   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Pour avoir tes 24 tranches horaires et pour chaque activité, tu peux faire ceci :
Code :
1
2
3
4
5
SELECT EXTRACT(HOUR FROM DATEHEURE_VAL_TEC) AS HEURE_VAL_TEC
    COUNT(DATEHEURE_VAL_TEC) AS VAL_TEC_HORAIRE
FROM delaitraite
WHERE CHAP = 'SANG_LOCAL'
GROUP BY EXTRACT(HOUR FROM DATEHEURE_VAL_TEC)
Si certaines activités peuvent ne pas avoir lieu à certaines heures, il te faut une table des heures que tu peux créer temporairement si tu n'en as pas besoin ailleurs.
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
CREATE TEMPORARY TABLE heure
(
    heure TINYINT NOT NULL
);
 
INSERT INTO heure
VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12),
    (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23), (24);
 
SELECT h.heure, t1.VAL_TEC_HORAIRE, t2.VAL_BIO_HORAIRE, t3.VAL_PVT_HORAIRE
FROM heure h
LEFT OUTER JOIN
(
    SELECT EXTRACT(HOUR FROM DATEHEURE_VAL_TEC) AS HEURE_VAL_TEC,
        COUNT(DATEHEURE_VAL_TEC) AS VAL_TEC_HORAIRE
    FROM delaitraite
    WHERE CHAP = 'SANG_LOCAL'
    GROUP BY EXTRACT(HOUR FROM DATEHEURE_VAL_TEC)
) t1 ON t1.HEURE_VAL_TEC = h.heure
LEFT OUTER JOIN
(
    SELECT EXTRACT(HOUR FROM DATEHEURE_VAL_BIO) AS HEURE_VAL_BIO,
        COUNT(DATEHEURE_VAL_BIO) AS VAL_BIO_HORAIRE
    FROM delaitraite
    WHERE CHAP = 'SANG_LOCAL'
    GROUP BY EXTRACT(HOUR FROM DATEHEURE_VAL_BIO)
) t1 ON t1.HEURE_VAL_BIO = h.heure
LEFT OUTER JOIN
(
    SELECT EXTRACT(HOUR FROM DATEHEURE_VAL_PVT) AS HEURE_VAL_PVT,
        COUNT(DATEHEURE_VAL_PVT) AS VAL_PVT_HORAIRE
    FROM delaitraite
    WHERE CHAP = 'SANG_LOCAL'
    GROUP BY EXTRACT(HOUR FROM DATEHEURE_VAL_PVT)
) t1 ON t1.HEURE_VAL_PVT = h.heure
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 18h43   #3
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 47
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 47
Points : 12
Points : 12
Merci de la réponse très précise !
Grâce à toi j'ai pu découvrir les LEFT OUTER JOIN que je ne connaissais pas.
Je testerais ça demain matin au boulot, et je reviens vers toi si ça fonctionne.

Simple question, pourquoi tous les LEFT OUTER JOIN sont fait sur t1 ? (et non t2 et t3 pour les deux derniers)
Logarithmix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 22h32   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par Logarithmix Voir le message
Simple question, pourquoi tous les LEFT OUTER JOIN sont fait sur t1 ? (et non t2 et t3 pour les deux derniers)
Erreur de copier-coller !
La seconde sous-requête a évidemment pour alias t2 et la troisième t3 !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 08h25   #5
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 47
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 47
Points : 12
Points : 12
La requête marche niquel, je te remercie CinePhil, il fallait la sortir cette requête !!!

Pour mon "WHERE" global (par exemple l'utilisateur via un formulaire pourra sélectionner un laboratoire spécifique, ou un correspondant...), je peux le mettre où ?

Comme de toute façon les filtres seront appliqués en php, je pense les répercuter dans chaque WHERE, après SANG_LOCAL. Je mettrais simplement 3 fois la variable.

Mais s'il existe une structure plus optimale, je suis toujours preneur.
Logarithmix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 08h37   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
je crains qu'il faille effectivement mettre tes autres conditions dans les trois WHERE.

Les trois sous-requêtes sont nécessaires à cause des 3 couples de colonnes sur lesquelles portent le regroupement et le calcul. Avec un autre modèle de données, tu aurais pu avoir une requête plus simple.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 09h42   #7
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 47
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 47
Points : 12
Points : 12
Rebonjour,

je reviens vers toi car il m'arrive une chose étonnante.

La requête fonctionne parfaitement sur phpmyadmin, mais ne passe pas sous PHP !

L'erreur retournée est :

Code :
Erreur 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 'INSERT INTO heure VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(1' at line 2
J'ai tourné le problème dans tous les sens, en spécifiant le nom de la colonne, en mettant des ' autour des chiffres mais rien n'y fait, le INSERT INTO ne passe pas avec PHP.


EDIT : J'ai résolu le problème en séparant mes requêtes dans 4 variables différentes ! (Création d'une table, intégration des données, sélection, suppression de la table)
Logarithmix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 10h50   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Il n'y a pas une requête mais plusieurs.
Dans phpMyAdmin, tu peux balancer le paquet complet mais dans un code PHP, il faut envoyer chaque requête séparément, ce que fait le programme phpMyAdmin d'ailleurs lui-même.
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
$sql = "
    CREATE TEMPORARY TABLE heure 
    ( 
        heure TINYINT NOT NULL 
    ) 
";
mysql_query($sql);
 
$sql = "
    INSERT INTO heure
    VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), 
        (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23), (24)
";
mysql_query($sql);
 
$sql = "
    SELECT h.heure, t1.VAL_TEC_HORAIRE, t2.VAL_BIO_HORAIRE, t3.VAL_PVT_HORAIRE 
    FROM heure h 
    LEFT OUTER JOIN 
    ( 
        SELECT EXTRACT(HOUR FROM DATEHEURE_VAL_TEC) AS HEURE_VAL_TEC, 
            COUNT(DATEHEURE_VAL_TEC) AS VAL_TEC_HORAIRE 
        FROM delaitraite 
        WHERE CHAP = 'SANG_LOCAL' 
        GROUP BY EXTRACT(HOUR FROM DATEHEURE_VAL_TEC) 
    ) t1 ON t1.HEURE_VAL_TEC = h.heure 
    LEFT OUTER JOIN 
    ( 
        SELECT EXTRACT(HOUR FROM DATEHEURE_VAL_BIO) AS HEURE_VAL_BIO, 
            COUNT(DATEHEURE_VAL_BIO) AS VAL_BIO_HORAIRE 
        FROM delaitraite 
        WHERE CHAP = 'SANG_LOCAL' 
        GROUP BY EXTRACT(HOUR FROM DATEHEURE_VAL_BIO) 
    ) t2 ON t1.HEURE_VAL_BIO = h.heure 
    LEFT OUTER JOIN 
    ( 
        SELECT EXTRACT(HOUR FROM DATEHEURE_VAL_PVT) AS HEURE_VAL_PVT, 
            COUNT(DATEHEURE_VAL_PVT) AS VAL_PVT_HORAIRE 
        FROM delaitraite 
        WHERE CHAP = 'SANG_LOCAL' 
        GROUP BY EXTRACT(HOUR FROM DATEHEURE_VAL_PVT) 
    ) t3 ON t1.HEURE_VAL_PVT = h.heure 
";
mysql_query($sql);
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h58.


 
 
 
 
Partenaires

Hébergement Web