2010-12-13 5 views
1

i ont une requête que je veux simplifier:MySQL - Comment simplifier cette requête?

select 
     sequence, 
     1 added 
     from scoredtable 
     where score_timestamp=1292239056000 
     and sequence 
     not in (select sequence from scoredtable where score_timestamp=1292238452000) 
     union 
select 
     sequence, 
     0 added 
     from scoredtable 
     where score_timestamp=1292238452000 
     and sequence 
     not in (select sequence from scoredtable where score_timestamp=1292239056000); 

Toutes les idées? fondamentalement, je veux extraire de la même table toutes les séquences qui sont différentes entre deux valeurs d'horodatage. Avec une colonne "ajoutée" qui représente si une ligne est nouvelle ou si une ligne a été supprimée.

table Source:

score_timestamp    sequence 
1292239056000    0 
1292239056000    1 
1292239056000    2 
1292238452000    1 
1292238452000    2 
1292238452000    3 

exemple entre (1292239056000, 1292238452000) résultat de la requête (2 lignes):

sequence added 
3  1 
0  0 

exemple entre (1292238452000, 1292239056000) résultat de la requête (2 lignes) :

sequence added 
0  1 
3  0 

Exemple entre (129 2239056000, 1292239056000) résultat de la requête (0 lignes):

sequence added 

Répondre

2

Cette requête obtient tout sequences qui apparaissent une seule fois dans les deux horodatages, et vérifie si elle se produit pour la première ou pour la deuxième horodatage.

SELECT 
    sequence, 
    CASE WHEN MIN(score_timestamp) = 1292239056000 THEN 0 ELSE 1 END AS added 
FROM scoredtable 
WHERE score_timestamp IN (1292239056000, 1292238452000) 
    AND (1292239056000 <> 1292238452000) -- No rows, when timestamp is the same 
GROUP BY sequence 
HAVING COUNT(*) = 1 

Il renvoie le résultat souhaité:

sequence added 
3  1 
0  0 
+0

+1 peter, j'ai raté/foiré ma compréhension de ce :) –

+0

grand! Merci beaucoup! –

+0

Oups! ce n'est pas la même requête! J'ai ajouté plus d'exemples qui ne sont pas satisfaits de cette requête :(Par exemple lors de la comparaison avec le même horodatage ou lors de la comparaison dans l'ordre inverse (je veux comparer plus haut avec timestamps plus bas aussi) .... –

0

Étant donné deux horodatages

SET @ts1 := 1292239056000 
SET @ts2 := 1292238452000 

vous pouvez obtenir vos ajouts et des suppressions avec:

SELECT s1.sequence AS sequence, 0 as added 
FROM scoredtable s1 LEFT JOIN 
    scoredtable s2 ON 
         s2.score_timestamp = @ts2 AND 
         s1.sequence = s2.sequence 
WHERE 
    s1.score_timestamp = @ts1 AND 
    s2.score_timestampe IS NULL 
UNION ALL 
SELECT s2.sequence, 1 
FROM scoredtable s1 RIGHT JOIN 
    scoredtable s2 ON s1.score_timestamp = @ts1 AND 
         s1.sequence = s2.sequence 
WHERE 
    s2.score_timestamp = @ts2 AND 
    s1.score_timestampe IS NULL 

en fonction du nombre des rangées et des statistiques cs la requête ci-dessus pourrait mieux fonctionner que grouper et avoir compte (*) = 1 version (je pense que cela aura toujours besoin d'un balayage complet, alors que l'union ci-dessus devrait pouvoir faire 2 x anti-join qui pourrait mieux s'en tirer)

Si vous avez ensemble de données importantes, faites le nous savoir qui est plus rapide (test avec SQL_NO_CACHE pour des résultats comparables)

Questions connexes