webForumDet fria alternativet

hjälp med statistik

3 svar · 423 visningar · startad av The_Hulk

The_HulkMedlem sedan juni 20031 837 inlägg
#1

Jag samlar ihop lite statistik i tabell, frågan är om jag ska markerar med ett status-fält vilket som är det senaste värdet eller bara ha ett timestamp-fält.

Jag vill kunna plocka ut de aktuella värdena för flera objekt på en gång men vill även kunna titta djupare på ett objekt och se värden längre tillbaka i tiden.

Kan man hämta det senaste värdet för alla objekt med en SQL-fråga?

tabell: stats

stat_id | obj_id | obj_val | stat_timestamp | status
--------+--------+---------+----------------+-------
  1     |  1     |   5     | 1              |   0   
  2     |  2     |   4     | 1              |   0   
  3     |  3     |   5     | 1              |   0   
  4     |  1     |   4     | 2              |   0   
  5     |  2     |   6     | 2              |   0   
  6     |  3     |   5     | 2              |   0   
  7     |  1     |   6     | 3              |   0   
  8     |  2     |   5     | 3              |   1   
  9     |  3     |   4     | 3              |   1   
 10     |  1     |   5     | 4              |   1

jag vill få ut de här värdena

stat_id | obj_id | obj_val | stat_timestamp | status
--------+--------+---------+----------------+-------
  8     |  2     |   5     | 3              |   1   
  9     |  3     |   4     | 3              |   1   
 10     |  1     |   5     | 4              |   1

Frågan är om jag behöver status-fältet eller kan jag få ut värdena på något annat sätt genom att ta det högsta värdet på stat_timestamp var varje obj_id?

Hoppas ni förstår vad jag menar.

LarsGMedlem sedan dec. 200012 464 inlägg
#2
select <kolumner>
  from stats
 where stat_timestamp =
  (select max(stat_timestamp)
      from stats as s
     where s.obj_id = stats.obj_id)
The_HulkMedlem sedan juni 20031 837 inlägg
#3

perfekt, fungerade precis som jag ville.
Såg att jag glömde nämna vilken databas jag använde. Det gällde MySQL 5.0.27.

The_HulkMedlem sedan juni 20031 837 inlägg
#4

Hmm,det fungerar men när man har ett par tusen poster i tabellen så börjar det gå långsamt.
Låt oss säga att jag har 5 olika värden för 1000 olika objekt, då kommer det att ta väldigt lång tid.
Värdena uppdateras 1-2ggr/dag, kanske är värt att ha med ett extra fält som anger om det är senaste värdet eller ej. när man lägger till nytt värde för ett objekt så sätter man den här flaggan till 0 på de gamla objekten. nackdelen är att man då måste göra 1000 extra sql-frågor.

Alternativt kan vara att man sätter flaggan till 2 när man lägger in det nya värdet och sen när man är klar med alla objekt så ändrar man de som har 1 till 0 och de som har 2 till 1. då behövs det bara två extra SQL-frågor.

137 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)