Avatar billede bondester Nybegynder
11. oktober 2008 - 00:32 Der er 7 kommentarer og
1 løsning

Finde bedste vækstrater

Hej

Jeg har en MySQL database som (i en forkortet udgave) ser ud som følger:

CREATE TABLE `players` (
  `id` smallint(5) unsigned NOT NULL auto_increment,
  `playername` varchar(30) NOT NULL default '',
  `alliance_id` smallint(5) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`),
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;

CREATE TABLE `players_history` (
  `player_id` smallint(5) unsigned NOT NULL default '0',
  `year` smallint(5) unsigned NOT NULL default '0',
  `month` tinyint(3) unsigned NOT NULL default '0',
  `day` tinyint(3) unsigned NOT NULL default '0',
  `points` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`player_id`,`year`,`month`,`day`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Som I nok kan regne ud er der et link mellem `players`.`id` og `players_history`.`player_id`! Feltet `players_history`.`points` er en værdi der skifter dag for dag. Jeg har via PHP kunne finde ud af dagens højdespringere. Men der er nu ved at være så meget data (400k records) at PHP er for langsom til det.

Nogen der kan komme op med en SQL løsning istedet? Altså en løsning der kun udskriver de data hvor `players_history`.`points` er steget med X ift. dagen før!

/ Bondester
Avatar billede arne_v Ekspert
11. oktober 2008 - 02:57 #1
prøv noget a la:

SELECT p.playername,h1.point-h2.point
FROM players_history h1,players p, players_history h2
WHERE h1.player_id=p.id AND p.id=h2.player_id
      AND h1.year=ytoday AND h1.month=mtoday AND h1.day=dtoday
      AND h2.year=yyesterday AND h2.month=myesterday AND h2.day=dyesterday
ORDER BY h1.point-h2.point DESC
LIMIT 10
Avatar billede bondester Nybegynder
11. oktober 2008 - 09:42 #2
Det vil ikke helt virke!

Jeg har rettet nogle s'er så den ser sådan ud:
SELECT p.playername,h1.points-h2.points
FROM players_history h1,players p, players_history h2
WHERE h1.player_id=p.id AND p.id=h2.player_id
      AND h1.year=ytoday AND h1.month=mtoday AND h1.day=dtoday
      AND h2.year=yyesterday AND h2.month=myesterday AND h2.day=dyesterday
ORDER BY h1.points-h2.points DESC
LIMIT 10

Men jeg får følgende fejl: "#1054 - Unknown column 'ytoday' in 'where clause'"
Går ud fra det er en indbygget variable, men ved ikke hvad jeg skal gøre ved det?
Avatar billede arne_v Ekspert
11. oktober 2008 - 15:23 #3
Nej. De 6 y m d today yesterday skal du sætte i din applikation !
Avatar billede bondester Nybegynder
11. oktober 2008 - 21:11 #4
Ahhh kørte den jo bare i MySQL for at se hvad den kom med af outputs... Jeg prøver lige at køre det som eksempel!
Avatar billede arne_v Ekspert
11. oktober 2008 - 22:10 #5
today skal være $ytoday i PHP o.s.v.
Avatar billede bondester Nybegynder
11. oktober 2008 - 22:52 #6
Det gav nogle ret underlige tal, men har rettet lidt til i SQL udtrykket da det godt kunne forekomme at points gik ned ad (som resulterede i et meget stort tal - ved sku ikke lige hvorfor) + tilføjet lidt flere data!

SELECT p.playername,h1.points AS idag,h2.points AS igaar,h1.points-h2.points
FROM players_history h1,players p, players_history h2
WHERE h1.player_id=p.id AND p.id=h2.player_id
      AND h1.year=ytoday AND h1.month=mtoday AND h1.day=dtoday
      AND h2.year=yyesterday AND h2.month=myesterday AND h2.day=dyesterday
      AND h1.points-h2.points < 100000
ORDER BY h1.points-h2.points DESC
LIMIT 10

En spiller vil aldrig (regner jeg da i hvert fald ikke med) stige 100.000 på en enkelt dag, så ovenstående virker. Men er der en bedre (læs mindre krævende) løsning??

Ellers må du meget gerne kvittere med et svar!
Avatar billede arne_v Ekspert
11. oktober 2008 - 22:56 #7
MySQL må beregne unsigned - unsigned som unsigned.

Og så er 5 unsigned - 7 unsigned et meget stort unsigned tal.

Problem kan måske løses ved nogle CAST til usigned.

Og svar.
Avatar billede bondester Nybegynder
12. oktober 2008 - 15:27 #8
Det er ligegyldigt dette fungerer upåklageligt!

Jeg takker for hjælpen....
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester