Toon posts:

[MySQL] Selecteer laatste wijziging

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een tabel met hierin:

tijd
alarmnr
alarmstatus

In het begin staan alle alarmstatus op 'off'. Zodra er één wijzigt, wordt alleen van dat alarm de nieuwe wijziging opgeslagen, aangezien het hier om een redelijk aantal alarmen gaat. Zodra het alarm weer uitgaat wordt dit uiteraard ook weer opgeslagen.

tijd - 00:00:00
alarmnr - 1
alarmstatus - 'off'

tijd - 00:00:00
alarmnr - 2
alarmstatus - 'off'

tijd - 00:10:12
alarmnr - 1
alarmstatus - 'on'

Hier moet dus uitkomen:
1 - on
2 - off

Nou wil ik een overzicht met welke alarmen op een bepaald tijdstip aan staan, maar ik heb geen idee hoe dit te doen, behalve dan per alarm de laatste tijd en status te selecteren. Maar om dit nou in een loop te zetten en telkens 256 maal (aantal alarmen) uit te voeren, is hoop ik nogal overbodig.

Iemand enig idee hoe ik dit het beste aan kan pakken?

Verwijderd

Is een select op alle alarmen die aan staan niet gewoon genoeg? of staan ze eigenlijk weer uit na een bepaalde tijd?

Edit: vraag verkeerd gelezen

VOlgens mij kun je beter het in tweeen splitsen:
- een logfile waarin elke verandering staat
- een table met de huidige situatie

als er een verandering is update je de table en sla je de verandering + tijd op in je logfile.

[ Voor 54% gewijzigd door Verwijderd op 26-10-2003 23:52 ]


Verwijderd

Topicstarter
Dat is geen optie, omdat het systeem voor analyse gebruikt moet kunnen worden. Er moeten dus niet alleen de huidige situatie maar ook die van een tijd terug de gegevens opgevraagd kunnen worden.

De enige optie die ik zo zie is gewoon alle alarmen opslaan als er maar één wijzigt, maar dat vind ik zelf niet zo slim ivm. enorme redundantie.

[ Voor 74% gewijzigd door Verwijderd op 26-10-2003 23:56 ]


Verwijderd

Hmm, uit mijn blote hoofd...

een select doen met een group by op het alarm nr en dan max(tijd) ?

Zoiets:

code:
1
2
3
4
select alarm_nr, status, max(tijd)
 from table
 where tijd =< time()
 group by alarm_nr, status

Verwijderd

Topicstarter
Dat is een hele mooie ja, dank je.

Hij geeft nu max. 256*2 rijen terug en dan kan ik gewoon even controleren welke de hoogste tijd heeft.

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Verwijderd schreef op 27 October 2003 @ 00:25:
Dat is een hele mooie ja, dank je.

Hij geeft nu max. 256*2 rijen terug en dan kan ik gewoon even controleren welke de hoogste tijd heeft.
order by tijd ;)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

Hier staat een uitleg hoe je dit soort problemen netjes kan oplossen met MySQL. Het is afhankelijk van de versie van MySQL die je hebt. In jouw geval moet je de vraag die bovenaan staat ("For each article, find the dealer(s) with the most expensive price.") vertalen naar "For each alarm, find the status with the maximum time which is less than time T." Het cursieve gedeelte is extra, maar is niet moeilijk toe te voegen.

Edit: een interessante oplossing staat in het commentaar. Ik citeer:
SELECT shop.*
FROM shop LEFT JOIN shop AS s2
ON shop.article=s2.article AND shop.price<s2.price
WHERE s2.article IS NULL

What's happening is that the first clauses of the ON is matching up articles. The second one does the work. Notice that when shop.price is at a maximum (for a given article), there is no s2.price that is greater than it - the s2 entries for that row will be NULL. And those are exactly the rows that the WHERE clause grabs.
Dit lijkt me prima toepasbaar op jouw probleem.

[ Voor 38% gewijzigd door ATS op 27-10-2003 10:18 . Reden: uitbreiding ]

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 18:29
Dit topic bookmark ik maar eens even want dit is echt één van de standaard problemen die je tegenkomt, ook als je bijvoorbeeld statistieken wil gaan maken.

offtopic:
[nieuws-gierig mode on]waar gebruik je dit eigenlijk voor, oftwel wat voor alarmen zijn het?

Verwijderd

Topicstarter
ATS: Momenteel is het 4.0 (huidige production release), waar subqueries voor zover ik weet niet werken. Joins daarentegen wel, maar alle relevante gegevens staan in één tabel...

offtopic:
djluc: Het is een onderdeel van een systeem om machines binnen een fabriek te controleren en analyseren, vandaar oa. de opslag van alle alarmen om zo achteraf na te kunnen gaan wat de oorzaak precies was.
Pagina: 1