Il ne sera pas assez (vous pouvez ajouter functions pour une meilleure lisibilité de vos requêtes si vous allez faire beaucoup)
En supposant que vous n'avez pas les connexions répartis sur plusieurs jours, vous pouvez effectuer les opérations suivantes
SELECT
user_id,
SUM(
TIMESTAMPDIFF(SECOND,
CASE
WHEN sessions.checkin < timestamp(date(sessions.checkin), maketime(9,0,0))
THEN timestamp(date(sessions.checkin), maketime(9,0,0))
WHEN sessions.checkin > timestamp(date(sessions.checkin), maketime(18,0,0))
THEN timestamp(date(sessions.checkin)+1, maketime(9,0,0))
ELSE
sessions.checkin
END,
CASE
WHEN IFNULL(sessions.checkout, now()) > timestamp(date(IFNULL(sessions.checkout, now())), maketime(18,0,0))
THEN timestamp(date(IFNULL(sessions.checkout, now())), maketime(18,0,0))
WHEN IFNULL(sessions.checkout, now()) < timestamp(date(IFNULL(sessions.checkout, now())), maketime(9,0,0))
THEN timestamp(date(IFNULL(sessions.checkout, now()))-1, maketime(18,0,0))
ELSE
IFNULL(sessions.checkout, now())
END)) AS score
FROM `sessions`
GROUP BY `user_id`
Il ne fonctionne pas si les connexions que plusieurs jours ou enjambent pour être p recise la requête peut fonctionner avec des connexions qui s'étendent sur plusieurs jours tels que checkin à 18h05 le premier jour et checkout à 8h55 le 3ème jour, mais dès qu'il s'étend sur un temps comptable sur plusieurs jours, la caluclation n'est pas terminée - pour chaque enregistrement qui s'étend sur des durées comptables sur plusieurs jours, vous devez soustraire le nombre de secondes non dénombrables du résultat. Faites-moi savoir si vous avez besoin d'aide pour cela. La requête ci-dessus devrait fonctionner relativement bon marché - étant donné que vous l'exécutez sur toute la table de toute façon, donc il va faire un scan de table, le fait qu'il y ait beaucoup de calculs répétés et que ça ressemble énorme ne devrait pas importer autant. Ces calculs se produisent en mémoire sans E/S supplémentaires et cela devrait se produire de quelques ordres de grandeur plus rapidement que les E/S disque (comparez avec le temps d'exécution de votre requête d'origine et faites-nous savoir si les performances sont dégradées).
Est-ce que cela doit être complètement dans MySQL ou peut-il être fait dans votre langage de programmation? Cela ressemble à une requête très compliquée. – Danosaure
il peut également être fait en php, si vous préférez .. Serait-il fonctionner de la façon suivante: calculer la différence entre 18h00 et 09h00 et multiplier avec les jours qui ont passé? – sparkle