2010-01-18 5 views
0

Dans ce tableau, je stocke des valeurs modifiables pour certains spids. Au fil des jours, ces valeurs peuvent changer, et un spid peut obtenir une nouvelle valeur.Déterminer la date 'valide jusqu'à' dans la requête MySQL

Maintenant, je veux savoir jusqu'à quand une certaine valeur est activée.

Ce sont les données pour un SPID unique

uid spid propertyvalue creationdate  
-------------------------------------------------- 
1 3  First name  2010-01-17 22:34:00 
37 3  Second name  2010-01-18 01:07:24 
38 3  Third name  2010-01-18 01:09:00 
39 3  Fourth name  2010-01-18 01:18:16 
40 3  Fifth name  2010-01-18 01:20:02 

Ainsi, la première valeur commence à 2010-01-18 01:07:24 et serait valable jusqu'au 01 2010-01-18: 01:00.

Je l'ai déjà essayé cette requête:

SELECT s1 . * , 
     s2.creationdate AS datetwo 
    FROM salespointproperty s1 
    JOIN salespointproperty s2 ON s1.spid = s2.spid 
          AND s1.creationdate < s2.creationdate 

Cela me donne beaucoup de doubles disques (certains d'entre eux mal), et il laisse toujours le dernier nouveau nom (comme il n'a pas de nouveau creationdate le suivant) Exemple:

uid spid propertyvalue creationdate   datetwo 
-------------------------------------------------------------- 
1 3  First name  2010-01-17 22:34:00 2010-01-18 01:07:24 * 
1 3  First name  2010-01-17 22:34:00 2010-01-18 01:09:00 
37 3  Second name  2010-01-18 01:07:24 2010-01-18 01:09:00 * 
1 3  First name  2010-01-17 22:34:00 2010-01-18 01:18:16 
37 3  Second name  2010-01-18 01:07:24 2010-01-18 01:18:16 
38 3  Third name  2010-01-18 01:09:00 2010-01-18 01:18:16 * 
1 3  First name  2010-01-17 22:34:00 2010-01-18 01:20:02 
37 3  Second name  2010-01-18 01:07:24 2010-01-18 01:20:02 
38 3  Third name  2010-01-18 01:09:00 2010-01-18 01:20:02 
39 3  Fourth name  2010-01-18 01:18:16 2010-01-18 01:20:02 * 

Seules les lignes avec un asterix sont corrects. Le cinquième nom est manquant.

+1

Ce jointure ne fait pas beaucoup de sens. –

+0

1. Vos données d'échantillon n'ont pas uid = 1. Veuillez ajouter cela. 2. Dans les résultats, les dates de création de l'uid 37-39 sont les dates de création de 36-38 respectivement. Est-ce correct? – lins314159

+0

Oui, ils l'étaient, je les ai réparés maintenant. – skerit

Répondre

1

En supposant que dans votre exemple, uid 37 est valable jusqu'au 38 uid, uid 38 est valable jusqu'au 39 uid etc.

SELECT 
    s1.uid, 
    s1.spid, 
    s1.propertyvalue, 
    s1.creationdate, 
    MIN(s2.creationdate) AS datetwo 
FROM salespointproperty s1 
INNER JOIN salespointproperty s2 
    ON s1.spid = s2.spid 
    AND s1.creationdate < s2.creationdate 
GROUP BY 
    s1.uid, 
    s1.spid, 
    s1.propertyvalue, 
    s1.creationdate; 
+0

Merci, cela liste seulement les bonnes dates. Parfait. Mais comment puis-je obtenir la date d'apparition? (La date qui n'a pas de date de fin ou qui devrait être NOW()) – skerit

+1

Changez INNER JOIN pour LEFT JOIN, changez le datetwo en 'COALESCE (MIN (s2.creationdate), MAINTENANT())'. – lins314159

+0

Génial, merci. – skerit

Questions connexes