Avatar billede justask Nybegynder
08. december 2005 - 18:04 Der er 11 kommentarer og
1 løsning

lave join eller sub-select på MAX(time)

Hej

Jeg har to tabeller, en med produkter (pro) og en med priserne (pri) på disse:

- pro.id, pro.name
- pri.pro_id, pri.price, pri.time (pri.pro_id relaterer til pro.id)

Hvert produkt får jævnligt nye priser så der kan være flere entries i "pri" for hvert entry i "pro". Mit problem er at jeg gerne vil joine disse to tabeller så jeg får alle produkterne ud, men kun een gang hver og med den nyeste pris.

Så vidt jeg forstår burde man kunne lave en sub-select eller joine på "max(pri.time)", men jeg kan ikke rigtig få det til at fungere...

Håber I kan hjælpe - takker...
Avatar billede innercitydk Nybegynder
08. december 2005 - 18:29 #1
Det er den forkerte måde at gøre det på.. du har en masse redundans i din pri tabel. Er der en speciel grund til at du ikke bare opdaterer det enkelte produkt, istedet for at lave en ny record hver gang

Vh
Avatar billede arne_v Ekspert
08. december 2005 - 20:14 #2
SELECT pro.name,pri1.price
FROM pro,pri pri1
WHERTE pro.id=pri1.pro_id AND pri1.time IN (SELECT MAX(pri2.time) FROM pri pri2 WHERE pri2.pro_id=pri1.pro_id)

måske
Avatar billede justask Nybegynder
09. december 2005 - 11:15 #3
innercitydk: Ja, der er en speciel grund ti lat jeg ikke bare opdaterer prisen på det enkelte produkt: jeg ønsker at kende historikken i prisudsvingene.

arne_v: Tak, det ser muligt ud, dog får jeg flg. sql-fejl som jeg ikke kan :

#1064 - You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT MAX(cp1.time)
FROM mr_campaign_prices cp1
WHERE cp1.

Min SELECT ser således ud:

SELECT * FROM prices cp, product pro WHERE cp.product_id=pro.id AND cp.time IN ( SELECT MAX(cp1.time) FROM prices cp1 WHERE cp1.product_id=cp.product_id );
Avatar billede innercitydk Nybegynder
09. december 2005 - 13:53 #4
skal det ikke være cp,pro istedet for cp,pro produkt?!
Avatar billede arne_v Ekspert
09. december 2005 - 14:08 #5
jo

men fejlen er senere

er det en gammel MySQL version (ældre end 4.1) ?
Avatar billede justask Nybegynder
09. december 2005 - 14:18 #6
Sorry - I min DB hedder tabellerne egentlig noget andet ("prices" og "products"); "prices" tabellen omdøbes til "pri" og "product" tabellen til "pro". Godt set ellers
Avatar billede justask Nybegynder
09. december 2005 - 14:19 #7
Jeg kører MySQL 4.0.18... Så jo, det er en ældre en.
Avatar billede arne_v Ekspert
09. december 2005 - 14:34 #8
4.0 = ikke subquery

jeg tror at du skal satse på 2 SQL sætninger

en SELECT MAX GROUP BY og en SELECT WHERE IN list with values
Avatar billede justask Nybegynder
09. december 2005 - 14:51 #9
Hmmm .... Jeg er vidst ikke helt med. Først SELECTe alle de produkter jeg vil vise, for hvert produkt finde MAX(pri.time) så "SELECTe price "WHERE pri.time IN " den max-tid jeg fandt før? Lyder godt nok tungt hvis man har store datamængder...

Sikke noget skidt. Jeg løser det nok via noget php-kode i stedet: JOINer de to tabeller sorteret på pri.time så seneste kommer først og filtrerer produkter fra der har været der een gang før i loopet.

Men tak for hjælpen selvom det ikke blev i een sql som håbet...
Avatar billede arne_v Ekspert
09. december 2005 - 21:06 #10
SELECT product_id,MAX(time) FROM pris GROUP BY produkt_id

læs værdier og lig dem i en streng adskilt af komma

SELECT * FROM produkt,pris WHERE produkt.id=pris.produkt_id AND pris.time IN (v1,v2,v3,v4,v5)

forudsætter at time er unik !!
Avatar billede arne_v Ekspert
31. december 2005 - 14:01 #11
OK ?
Avatar billede justask Nybegynder
31. december 2005 - 14:35 #12
tja, det bliver vel ikke bedre ... 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