2010-06-22 6 views
4

J'ai besoin d'aide pour une requête.trouver la dernière ligne consécutive

Je possède ce tableau simple:

CREATE TABLE `consecutiv` (
    `id` int(11) NOT NULL auto_increment, 
    `readVal` int(11) default NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=latin1; 


insert into `consecutiv`(`id`,`readVal`) values (1,2),(2,2),(3,2),(5,3),(6,3),(7,3),(8,3),(9,4),(10,5),(11,6),(12,6),(13,2),(14,2),(15,6); 

ressemble à ceci:

id readVal 
    1 2 
    2 2 
    3 2 
    5 3 
    6 3 
    7 3 
    8 3 
    9 4 
    10 5 
    11 6 
    12 6 
    13 2 
    14 2 
    15 6 

Je veux obtenir un readVal donné la dernière ligne consécutive:

Dans l'exemple ci-dessus serait:

id: 3 pour readVal = 2

id: 8 pour readVal = 3

... 

J'ai essayé avec cette requête:

SELECT consecutiv.id, consecutiv.readVal, c.id, c.readVal FROM consecutiv 
JOIN consecutiv c ON consecutiv.id = c.id-1 
WHERE consecutiv.readVal!=c.readVal ORDER BY consecutiv.id ASC 

Et ça marche aussi longtemps que il n'y a pas ids manquantes dans la série. Dans l'exemple ci-dessus, l'identifiant n ° 4 est manquant et la requête ne renverra pas le résultat attendu.

Merci!

+1

Vous dites que vous attendez 'id: 3 pour readVal = 2' sûrement la dernière consécutive pour ceci est 13/14? –

Répondre

3
SELECT a.id, a.readVal 
FROM consecutiv a 
WHERE a.readVal != 
    (SELECT b.readVal 
    FROM consecutiv b 
    WHERE b.id > a.id 
    ORDER BY id ASC 
    LIMIT 1) 
ORDER BY a.id; 

retours:

id | readval 
----+--------- 
    3 |  2 
    8 |  3 
    9 |  4 
10 |  5 
12 |  6 
14 |  2 

pour le cas où la dernière ligne est également nécessaire:

SELECT c.id, c.readVal, c.nextReadVal 
FROM 
    (SELECT 
    a.id, a.readVal, 
    (SELECT b.readVal 
     FROM consecutiv b 
     WHERE b.id > a.id 
     ORDER BY id ASC 
     LIMIT 1) AS nextReadVal 
    FROM consecutiv a) AS c 
WHERE readVal != nextReadVal OR nextReadVal IS NULL 
ORDER BY c.id; 

retours:

id | readval | nextreadval 
----+---------+------------- 
    3 |  2 |   3 
    8 |  3 |   4 
    9 |  4 |   5 
10 |  5 |   6 
12 |  6 |   2 
14 |  2 |   6 
15 |  6 | 
+0

@rudi Actuellement, ça donne 2 résultats pour readval = 2. Edit Oh je vois je pense par * "Je veux obtenir pour une readVal donnée la dernière rangée consécutive:" * l'OP signifie dernier dans chaque paire ne pas durer dans la dernière paire consécutive dans le tableau. Dans ce cas, cela ressemble à la meilleure réponse! –

+0

Oui! C'est exactement ce que je cherchais. Je vous remercie! – Bogdan

+1

Etes-vous sûr que vous n'avez pas besoin de la ligne avec l'identifiant 15 (val 6) dans votre résultat? De votre définition de "la dernière rangée consécutive" il devrait être retourné aussi, ou? (Je vais ajouter une requête pour ce cas aussi) –

Questions connexes