[SQL] Product + huidige prijs query

Pagina: 1
Acties:

  • corné
  • Registratie: Juni 2002
  • Laatst online: 14-11-2024
Ik heb de volgende tabellen in een Postgresql database:

Afbeeldingslocatie: http://buggyashell.nl/Drawing1.jpg

met de data:
Afbeeldingslocatie: http://buggyashell.nl/naamloos.JPG

Wat ik wil is dat ik een lijst met alle artikelen met de huidige prijs (laatste datum < NOW()) kan ophalen in 1 query.
Ik los dit nu nog op met een aparte query die ik per artikel uitvoer, maar dat is nogal traag als er veel artikelen zijn.

Misschien weet iemand hier een oplossing voor? dankuuu

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:28

gorgi_19

Kruimeltjes zijn weer op :9

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
Mja, dit is eigenlijk een beetje basic SQL kennis hoor. :) Snor eens een tutorial op over SQL, lees eens iets over JOINS en aggregated functies. :)

en Having heb je hier afaik niet nodig :)

https://fgheysels.github.io/


  • corné
  • Registratie: Juni 2002
  • Laatst online: 14-11-2024
hmm ik wat beter moeten zoeken denk ik, zo moeilijk was ie niet :P
heb em zo:

code:
1
2
3
4
5
6
7
8
9
10
SELECT artikelnummer, naam, prijs FROM Artikel
LEFT JOIN prijs_datum ON artikelnummer=artikel
WHERE datum = (SELECT max(datum) 
         FROM prijs_datum 
         GROUP BY artikel, datum 
         HAVING artikel=artikelnummer 
         AND datum <= NOW() 
         ORDER BY datum DESC LIMIT 1 
        )
ORDER BY artikelnummer

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:28

gorgi_19

Kruimeltjes zijn weer op :9

Volgens mij ga je je performance nog een stuk verbeteren als je de Having er uit kan slopen en er een WHERE clausule van kan maken :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Offtopic, maar ik kan het niet laten: waarom is Prijs onderdeel van de PK?

{signature}


  • Yo-han
  • Registratie: December 2001
  • Laatst online: 02-10 14:12

Yo-han

nope.

gorgi_19 schreef op maandag 08 januari 2007 @ 09:45:
Volgens mij ga je je performance nog een stuk verbeteren als je de Having er uit kan slopen en er een WHERE clausule van kan maken :)
Ter verduidelijking, HAVING doet aggregatie op het totale resultaat van de querie. WHERE beperkt al gelijk het resultaat, wat dus in een enorme performance winst kan resulteren bij grote resultaten.

  • xos
  • Registratie: Januari 2002
  • Laatst online: 25-11 17:08

xos

Je zou ook zoiets kunnen doen:
code:
1
2
3
select p1.* from prijs_datum p1
 join (select artikelnummer, max(datum) as datum from prijs_datum group by artikelnummer) p2
on p1.artikelnummer= p2.artikelnummer and p1.datum= p2.datum
Voutloos schreef op maandag 08 januari 2007 @ 09:51:
Offtopic, maar ik kan het niet laten: waarom is Prijs onderdeel van de PK?
Waarschijnlijk omdat in zijn huidige constructie de prijs van een produkt anders maar 1 keer per dag aangepast kan worden. Desalniettemin is het niet erg netjes.

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
xos schreef op maandag 08 januari 2007 @ 10:09:
Waarschijnlijk omdat in zijn huidige constructie de prijs van een produkt anders maar 1 keer per dag aangepast kan worden. Desalniettemin is het niet erg netjes.
Dus dan heb je tupels {1, '2.00', 08-01-06} en {1, '2.50', 08-01-06} in je DB zitten en mag je gokken welke prijs je neemt voor artikel 1? Art.nr. & datum zou op zichzelf al een unieke combinatie moeten zijn. Als je per se op 1 dag vaker prijzen wil aanpassen moet je niet alleen datum opslaan, maar ook tijdstip.

{signature}


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:28

gorgi_19

Kruimeltjes zijn weer op :9

Voutloos schreef op maandag 08 januari 2007 @ 10:58:
[...]
Dus dan heb je tupels {1, '2.00', 08-01-06} en {1, '2.50', 08-01-06} in je DB zitten en mag je gokken welke prijs je neemt voor artikel 1? Art.nr. & datum zou op zichzelf al een unieke combinatie moeten zijn. Als je per se op 1 dag vaker prijzen wil aanpassen moet je niet alleen datum opslaan, maar ook tijdstip.
Dan kan je nog steeds dat probleem krijgen :) Kan je beter een unique constraint zetten op datum + artikelnummer :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1