2017-05-30 1 views
0

Le tableau mysql nous travaillons a données dans le format suivant:Conversion du résultat d'une table MySQL selon l'exigence

entityId status updated_date 
    ------------------------------- 
     1   1  29/05/2017 12:00 
     1   2  29/05/2017 03:00 
     1   3  29/05/2017 07:00 
     1   4  29/05/2017 14:00 
     1   5  30/05/2017 02:00 
     1   6  30/05/2017 08:00 
     2   1  31/05/2017 03:00 
     2   2  31/05/2017 05:00 
     . 
     . 

Ainsi, chaque id entité a 6 statuts, et chaque état a une datetime de mise à jour. Chaque statut a une activité attachée à celui-ci. Par exemple 1 - déplacement vers B. etc

je dois obtenir une sortie dans le format ci-dessous pour id entité spécifique, par exemple 3 et 4. Left Point A, je dois - Commencé voyage 2 - première destination atteint 3 le temps pour les statuts 3 et 4 indépendamment.

entity_id time_started_journey time_reached_first_destination 
      (update time of status 3) (update time of status 4) 
    -------------------------------------------------------------- 
     1  29/05/2017 7:00   29/05/2017 14:00 
     2  30/05/2017 7:00   30/05/2017 16:00 

Plus tard, j'ai besoin de calculer le temps total qui serait la différence entre les deux.

Comment puis-je atteindre le résultat souhaité en utilisant mysql.

J'ai essayé d'utiliser l'opérateur Union mais je ne peux pas le faire séparément. Également, essayé en utilisant le cas when operator avec la requête ci-dessous, mais a échoué.

select distinct entityid, 
(case status when 3 then freight_update_time else 0 end) 
as starttime, 
(case status when 4 then freight_update_time else 0 end) as endtime 
from table ; 

Quelqu'un peut-il nous éclairer à ce sujet?

+0

Vous êtes sur la bonne voie avec les expressions de cas, mais vous aurez besoin d'utiliser l'agrégation (GROUP_CONCAT spécifiquement) au lieu DISTINCT, et l'autre cas est 'else null' (les agrégations ignorent généralement null). En ce qui concerne le problème de décalage horaire, vous devrez convertir vos chaînes de date en valeurs de date appropriées; alors vous pouvez utiliser les fonctions de date intégrées de MySQL. – Uueerdo

+0

Voir: [Pourquoi devrais-je fournir un MCVE pour ce qui me semble être une requête SQL très simple?] (Https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve -pour-ce-qui-me-semble-à-être-un-très-simple-sql-requête) – Strawberry

Répondre

1

L'agrégation conditionnelle est une façon de renvoyer un jeu de résultats qui ressemble à cela.

SELECT t.entityid 
     , MAX(IF(t.status=3,t.updated_date,NULL)) AS time_started_journey 
     , MAX(IF(t.status-4,t.updated_date,NULL)) AS time_reached_first_destination 
    FROM mytable t 
    WHERE t.status IN (3,4) 
    GROUP BY t.entityid 
    ORDER BY t.entityid 

Ceci est juste une suggestion; la spécification n'est pas claire sur ce que la requête devrait faire avec les valeurs d'état dupliquées pour un entityid donné.

Il existe d'autres modèles de requête qui renverront des résultats similaires.

1

Ma requête dans MySQL

SELECT 
    e3.updated_date AS sta3, 
    e4.updated_date AS sta4 
FROM 
    `prueba` AS e3 
LEFT JOIN prueba AS e4 
ON 
    e3.entityId = e4.entityId AND e4.status = 4 
WHERE 
    e3.status = 3 

SORTIE:

result screenshot