Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: mysql query die verandering van waarde in tabel als resultaat heeft mogelijk?  (gelezen 2008 keer)

Is er een makkelijke methode om de records te vinden in mysql waarin de waarde van een bepaalde kolom veranderd?

Bijvoorbeeld voor verandering in de tweede kolom:

1   4
2   4
3   4
4   4
5   6
6   6
7   6
8   6
9   4
10  4
11  4
12  2

De query zou bij deze tabel dan de volgende records moeten teruggeven:

5   6
9   4
12  2

Of liever nog inclusief de records net voor de verandering:

4   4
5   6
8   6
9   4
11  4
12  2

De enige manier die ik op dit moment kan bedenken is om de hele tabel te kopiëren, de kolom waarden van de kolom waarvan de wijzigingen moeten worden gevonden één record naar beneden schuiven, en dan de orginele en de nieuwe tabel vergelijken op die kolom, en waar de waarden niet gelijk zijn die index is dan een wijziging.

Maar dacht ik, dat moet toch makkelijker kunnen?
« Laatst bewerkt op: 2011/03/30, 16:10:56 door Thomas de Graaff »

Gevonden. :) Met hulp van TonH.

Met een 'correlated' subquery kan dit.

SELECT index, variabele FROM tabel AS tabelA WHERE variabele <> (SELECT variabele FROM tabel AS tabelB WHERE tabelB.index = tabelA.index +1);

Of de gewenste in bovenstaand bericht:

SELECT index, variabele FROM tabel AS tabelA WHERE variabele <> (SELECT variabele FROM tabel AS tabelB WHERE tabelB.index = tabelA.index +1)  OR variabele <> (SELECT variabele FROM tabel AS tabelB WHERE tabelB.index = tabelA.index - 1);
« Laatst bewerkt op: 2011/03/30, 17:46:23 door Thomas de Graaff »

Offline Rachid

  • Lid
    • rachidbm
    • Mijn blog
Ik weet uit mijn hoofd niet zo een oplossing. Maar kun je misschien nog even vertellen wat je uiteindelijk wilt bereiken? Waar ga je dit voor toepassen... Misschien wordt het dan ook nog wat duidelijker.

edit: Oh lol, dat is snel. Mooi! En nu snap ik ook beter wat je nou wilde :P
Ben je ook blij dat Ubuntu zo toegankelijk en gratis is, en wil je graag net als ik iets terugdoen, kijk dan eens rond bij mwanzo, dé poort naar het bijdragen aan Ubuntu en haar gemeenschap!

Sja, zo'n query is idd. wel lekker duidelijk. :D

Voor wat betreft de toepassing, ik wil datapunten in een grafiek zetten van een discrete variabele die gemeten wordt. En dan is het zinvol alleen de punten van verandering door te geven. Dat scheelt een hoop data als de tussenliggende waarden toch niet veranderen. De grafiek komt in een webpagina, jqplot. Dus zo min mogelijk datapunten doorgeven is dan wel handig. :)

Deze query was te veel belastend, te traag omdat voor iedere waarde een aparte select gedaan moet worden. Dat schiet niet op. Na geklooi met triggers om een extra kolom toe te voegen waarin wordt bijgehouden of een waarde gewijzigd is of niet was het uiteindelijk mogelijk om het met een query op te lossen:

SELECT tabel_A.index,tabel_A.variabele FROM tabel AS tabel_A INNER JOIN tabel AS tabel_B ON tabel_A.index = (tabel_B.index +1) WHERE tabel_A.variabele != tabel_B.variabele;

Offline Rachid

  • Lid
    • rachidbm
    • Mijn blog
Nog iets anders. Heb je indexes op je tabel gelegd? Dit kan je query aanzienlijk versnellen, vooral bij grote datasets! Of een view aanmaken kan ook helpen.
Ben je ook blij dat Ubuntu zo toegankelijk en gratis is, en wil je graag net als ik iets terugdoen, kijk dan eens rond bij mwanzo, dé poort naar het bijdragen aan Ubuntu en haar gemeenschap!

Nee, daar heb ik nog niet naar gekeken. Maar de laatste query gaat razendsnel, dus voorlopig is er de behoeft nog niet. Maar zodra de boel traag wordt kom ik erop terug. ;)