Avatar billede superzapper Nybegynder
15. januar 2006 - 13:06 Der er 26 kommentarer

Klassisk prisliste problem

Jeg har et klassisk sql problem som jeg ikke lige kan huske at løse.

De to nedenstående tabeller skal joines således at jeg for hver vare kan finde Id, Navn og Pris (hvor prisen skal være den med den højeste startdato som passer til den enkeælte vare).

Vare
----
|Id
|Navn
----

Vareliste
---------
|Id
|VareId
|Pris
|StartDato
---------
Avatar billede trumf Nybegynder
15. januar 2006 - 14:00 #1
SELECT v.Id, v.Navn, vl.Pris FROM Vare v INNER JOIN Vareliste vl ON v.Id = vl.VareId
Avatar billede superzapper Nybegynder
15. januar 2006 - 14:20 #2
Det vil returnere for mange poster. Hvis der er mere end 1 post i vareliste til en given vare vil begge returneres - jeg skal kun bruge den nyeste. Det er det der er hele problemet - ellers gav det sig selv...
Avatar billede superzapper Nybegynder
15. januar 2006 - 14:22 #3
Kan godt være det var dårligt beskrevet, men startdato er den dato en ny pris er sat i listen. (Hmm måske skulle den hedde prisliste men never mind)...
Avatar billede superzapper Nybegynder
15. januar 2006 - 14:25 #4
Eksempel:

vare indeholder:
ID  Navn
1    Vase

vareliste indeholder
ID  VareId  Pris  Startdato
1    1        50    2005.01.02
1    1        40    2005.01.05

Så skal jeg have returneret:
Navn  Pris
Vase  40
Avatar billede trumf Nybegynder
15. januar 2006 - 14:27 #5
SELECT DISTINCT vl.Id, v.Id, v.Navn, vl.Pris FROM Vare v INNER JOIN Vareliste vl ON v.Id = vl.VareId ORDER BY vl.StartDato

Hvad med denne ?
Avatar billede trumf Nybegynder
15. januar 2006 - 14:30 #6
eller

SELECT v.Id, v.Navn, MIN(vl.Pris) FROM Vare v INNER JOIN Vareliste vl ON v.Id = vl.VareId GROUP BY vl.Pris
Avatar billede superzapper Nybegynder
15. januar 2006 - 14:31 #7
Virker heller ikke. Alle poster returneres stadig da distinct ser på alle felter der hentes og ikke kun der første efter ordet distinct.
Det var nemlig også min første ide...
Avatar billede superzapper Nybegynder
15. januar 2006 - 14:32 #8
Den næste holder heller ikke da en vare godt kan stige og falde i pris over tid - så vil min(pris) eller max(pris ikke virke)..
Avatar billede superzapper Nybegynder
15. januar 2006 - 14:33 #9
Min(pris) vil jo iøvrigt tage den mindste pris i hele tabellen - den skal også holde op imod så det matcher det rigtige id...
Avatar billede trumf Nybegynder
15. januar 2006 - 14:34 #10
Så lav group på datoen
Avatar billede superzapper Nybegynder
15. januar 2006 - 14:35 #11
Hvordan mener du? Hvordan vil det hjælpe med at få filtreret den ekstra række fra?
Avatar billede trumf Nybegynder
15. januar 2006 - 14:35 #12
SELECT DISTINCT vl.Id, v.Id, v.Navn, vl.Pris FROM Vare v INNER JOIN Vareliste vl ON v.Id = vl.VareId ORDER BY vl.StartDato GROUP BY vl.StartDato
Avatar billede trumf Nybegynder
15. januar 2006 - 14:37 #13
Hovsa :)

SELECT v.Id, v.Navn, vl.Pris, MAX(vl.StartDato) FROM Vare v INNER JOIN Vareliste vl ON v.Id = vl.VareId GROUP BY vl.StartDato
Avatar billede superzapper Nybegynder
15. januar 2006 - 14:40 #14
Den giver mig stadig flere rækker med samme VareId tilbage..
Avatar billede trumf Nybegynder
15. januar 2006 - 14:43 #15
I ovenstående går jeg ud fra at vare.Id = Vareliste.VareId er det ikke rigtigt ?
Avatar billede superzapper Nybegynder
15. januar 2006 - 14:44 #16
Ja... Men jeg får stadig 2 poster tilbage der har samme Vareliste.VareId og dermed samme navn
Avatar billede superzapper Nybegynder
15. januar 2006 - 14:47 #17
Ahh det er vidst sortid jeg skal group på... Det ser ud til at virke...
Avatar billede superzapper Nybegynder
15. januar 2006 - 14:47 #18
Og så er det med max overflødigt..
Avatar billede superzapper Nybegynder
15. januar 2006 - 14:49 #19
SELECT *
FROM vare v INNER JOIN vareliste vl ON v.Id = vl.vareId GROUP BY vl.vareid
Order By vl.startdato desc

Er løsningen helt præcist hvis andre skulle søge på det samme spørgsmål.
Avatar billede superzapper Nybegynder
15. januar 2006 - 14:52 #20
Ahh nej, jeg sidder og sover - den holder heller ikke for jeg får stadig den laveste laveste dato's pris med ud :(
Avatar billede trumf Nybegynder
15. januar 2006 - 15:03 #21
Jeg har en baby der er vågen og en kone der er ude og køre, så du må undvære mig lidt, håber en anden kan hjælpe, ellers kigger  jeg lige forbi senere...
Avatar billede trumf Nybegynder
15. januar 2006 - 15:04 #22
du kan kigge lidt på denne i mens :) http://www.eksperten.dk/spm/679694
Avatar billede superzapper Nybegynder
15. januar 2006 - 15:05 #23
Ok, jeg krydser fingre for der kommer hjælp og ellers må vi kigge videre på det senere...
Avatar billede superzapper Nybegynder
15. januar 2006 - 15:56 #24
SELECT *
FROM sort s, sortliste sl
WHERE s.Id = sl.sortid
AND sl.id = (SELECT sl.id FROM sortliste sl WHERE sl.sortid = s.id Order BY startdato desc limit 1)
Order By sl.startdato desc

Så lykkedes det at finde en løsning
Avatar billede wetdog Nybegynder
15. januar 2006 - 15:59 #25
noget ala :

SELECT * FROM vare, vareliste WHERE id IN (SELECT DISTINCT VareId, Pris FROM VARELISTE ORDER BY Startdato DESC)
Avatar billede wetdog Nybegynder
15. januar 2006 - 15:59 #26
arh - så ikke din egen løsning
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