WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Problem med Having i Mysql (https://www.wn.se/forum/showthread.php?t=1925)

Andreas 2004-03-29 20:19

Har ett problem med en sql-sats, eller om det är min mysql-databas.
Databasen finns att hämta på http://www.digital-network.nu/finance.sql
Meningen är att jag vill ställa upp databasen, enligt följande princip:
Citat:


EMU Euro EUR 9.25 0.03
USA Dollar USD 7.39 -0.04
Dansk Krone DKK 1.20 0.02
...

Valutakurserna skall alltså ställas upp enligt, name, prfx, value och förändring sedan senaste mätning.

Fick då rekommendationen att följande sql-sats skulle lösa detta. Men så verksr ej vara fallet, får felet, "Unknown column 'e1.vdat' in 'having clause"
Kod:

select n.name, n.prfx, e1.value, e1.value - e3.value
 from name_tbl n join ecb_tbl e1
  on n.prfx = e1.name
 join ecb_tbl e2
  on e1.name = e2.name
 join ecb_tbl e3
  on e2.name = e3.name
 and e3.vdat < e2.vdat
 join ecb_tbl e4
  on e3.name = e4.name
 and e4.vdat < e2.vdat
group by n.name, n.prfx, e1.value, e1.vdat, e3.value, e3.vdat
having max(e2.vdat) = e1.vdat and max(e4.vdat) = e3.vdat

tack
Andreas

Per 2004-03-30 00:44

Du måste select'a det du ska ha göra 'having by' med. Följande fungerar, men det finns förstås en del kriterier; exempelvis att det måste finnas minst två poster med olika datum men det är ju inget problem i live-miljön får man anta.

Kod:

select
  n.name,
  n.prfx,
  e1.value,
  e1.value - e3.value,
  e1.vdat,
  e3.vdat
from
  name_tbl n
    join ecb_tbl e1 on n.prfx = e1.name
    join ecb_tbl e2 on e1.name = e2.name
    join ecb_tbl e3 on e2.name = e3.name and e3.vdat < e2.vdat
    join ecb_tbl e4 on e3.name = e4.name and e4.vdat < e2.vdat
group by
  n.name,
  n.prfx,
  e1.value,
  e1.vdat,
  e3.value,
  e3.vdat
having
  max(e2.vdat) = e1.vdat and
  max(e4.vdat) = e3.vdat


Andreas 2004-03-31 02:22

Tack, det fungerade så som jag ville ha det. Perfekta värden.
Dock är detta kanske en "dum" fråga, men varför listas inte alla resultaten när jag kör denna fråga, miss visar endast Norska krone?

tack
Andreas

Andreas 2004-04-02 16:01

Fungerar nu, var jag som hade ett fel i databasen, tack för sql-satsen.

Andreas

Andreas 2004-06-29 21:03

Har fått nya problem, denna uträkning verkar kräva fruktansvärt mycket data att uträkna. Fick mail ifrån ett webbhotell jag använder att uträkningen tar slut på resurser.
Vänligen vad skall jag göra?

Andreas

Robert 2004-06-29 23:22

Citat:

Originally posted by Andreas@Jun 29 2004, 21:03
Har fått nya problem, denna uträkning verkar kräva fruktansvärt mycket data att uträkna. Fick mail ifrån ett webbhotell jag använder att uträkningen tar slut på resurser.
Vänligen vad skall jag göra?

Andreas

Tar slut på resurser? Hur många rader har du i tabellen?

Andreas 2004-06-30 09:02

name_tbl: 295 rader
ecb_tbl: 1575 rader

Andreas

Robert 2004-06-30 23:45

Om vi lämnar sql frågan och istället funderar på om det går att köra en sql sats (jobb) per dag som gör precis det du vill men lägger resultatet i en anna tabell för senare visning, eller är datat verkligen realtime alternativt dynamiskt?

Anders 2004-07-01 08:09

Citat:

Ursprungligen postat av Andreas
Har fått nya problem, denna uträkning verkar kräva fruktansvärt mycket data att uträkna. Fick mail ifrån ett webbhotell jag använder att uträkningen tar slut på resurser.
Vänligen vad skall jag göra?

Andreas

Det är pga HAVING som din fråga tar mycket resurser. MySQL optimerar inte HAVING på något sätt, därför bör du undvika dem.

<!--QuoteBegin--MySQL Manual[/i]@ Jul 1 2004, 08:09

The HAVING clause can refer to any column or alias named in a select_expr. It is applied nearly last, just before items are sent to the client, with no optimization. (LIMIT is applied after HAVING.)
[/quote]

Andreas 2004-07-09 09:52

Verkar som jag får effektivisera hela databasen.

Tänkte om man kunde skriva en smidigare sats som skriver ut på följande sätt.

Plockar ut de senaste värdena (dvs högst 'vdat') och jämför med 'vdat- 1' finns ingen data på 'vdat - 1' skriver den inte ut något.

Dvs man minskar frågan ganska rejält.

Är detta en lösning, och isf hur skulle en effektiv sql-sats se ut?

Andreas


Alla tider är GMT +2. Klockan är nu 23:05.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson