Voici une "petite" requête qui récupère la somme totale des temps passés, des RTT et des heures supplémentaires accumulées pour chaque employé toujours actif pour un mois donné.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
45
46
47
48
49
50
51
SELECT CONCAT( geogestion_personnel.nom, ' ', geogestion_personnel.prenom ) AS nom,
SUM( total ) AS total,
SUM( RTT ) AS RTT,
SUM( sup ) AS sup
FROM geogestion_personnel
LEFT JOIN (
    SELECT perso,
    ROUND( SUM( duration ) , 2 ) AS total,
    ROUND(
        IF( cal_flags.libelle = 'null',
            CASE DATE_FORMAT( cal.date, '%w' )
            WHEN 1 THEN 
                0
            WHEN 2 THEN
                GREATEST( 0, LEAST( 1, SUM( duration ) -7 ) )
            WHEN 3 THEN
                GREATEST( 0, LEAST( 1, SUM( duration ) -7 ) )
            WHEN 4 THEN
                GREATEST( 0, LEAST( 1, SUM( duration ) -7 ) )
            WHEN 5 THEN
                0
            END , 0
        ) , 2
    ) AS RTT,
    ROUND(
        IF( cal_flags.libelle = 'null',
            CASE DATE_FORMAT( cal.date, '%w' )
            WHEN 1 THEN
                GREATEST( 0, SUM( duration ) -7 )
            WHEN 2 THEN
                GREATEST( 0, SUM( duration ) -8 )
            WHEN 3 THEN
                GREATEST( 0, SUM( duration ) -8 )
            WHEN 4 THEN
                GREATEST( 0, SUM( duration ) -8 )
            WHEN 5 THEN
                GREATEST( 0, SUM( duration ) -7 )
            END ,
            SUM( duration )
        ) , 2
    ) AS sup
    FROM tp
    LEFT JOIN cal ON ( tp.date = cal.date )
    LEFT JOIN cal_flags ON ( cal.flag = cal_flags.flag )
    WHERE tp.date BETWEEN '2006-01-01' AND '2006-01-31'
    GROUP BY cal.date, perso
) AS tmp ON ( geogestion_personnel.id = tmp.perso )
WHERE geogestion_personnel.dateSortie = '0000-00-00'
GROUP BY geogestion_personnel.nom, geogestion_personnel.prenom, geogestion_personnel.bureau
ORDER BY geogestion_personnel.bureau ASC , nom ASC
LIMIT 0 , 30
La table dérivée ne semble pas provoquer de problème, en revanche, l'ensemble fait quasiment systématiquement crasher mysql...

Je viens de faire un petit changement, et ça semble régler le problème :
J'ai remplacé cette ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
ORDER BY geogestion_personnel.bureau ASC , nom ASC
par celle-ci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
ORDER BY geogestion_personnel.bureau ASC, geogestion_personnel.nom ASC,geogestion_personnel.prenom ASC
et il semblerait que mysql ne crash plus.

Cela n'aurait donc été qu'un problème d'ambiguïté ou y a-t-il une raison plus spécifique, comme par exemple le tri sur un CONCAT qui provoquerait des crashs ?

Edit :
Je viens de refaire le test en remplaçant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
CONCAT(nom,' ',prenom) as nom
...
ORDER BY... nom ASC
par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
CONCAT(nom,' ',prenom) as nome
...
ORDER BY... nome ASC
Et ça re-plante. Mysql aurait-il un bug au niveau du tri sur un CONCAT ?

Edit2 :
C'était trop beau... Ca plante toujours avec le changement initial sur ORDER BY.