Lastige SQL query

Pagina: 1
Acties:

  • jopiek
  • Registratie: September 2000
  • Laatst online: 06-05 15:04

jopiek

Tja... 'ns ff denken.

Topicstarter
Na enig zoekwerk op forum toch geen bevredigend antwoord gevonden.

ik ben bezig met een LEGO pricewatch (woei!!!) naar model van Tweakers.net FP

Nu zou het zonde zijn als je niet bij kon houden net als op Tweakers wat het prijsverloop is dus oude prijzen moeten niet weggegooid worden maar de meest recente prijs moet getoond worden.

Dit is de link naar de pricewatch het probleem zit 'm dan in het tonen van de sets:
in "City Bouwen" / "Construction Site" zitten toch echt twee prijzen voor de winkel superspeelgoed:
een met prijs 34.15 en timestamp 2005-05-19 22:56:26 en een met prijs 34.10 en timestamp 2005-05-23 10:36:17

Dit is de query die ik uitvoer om de shops te krijgen zal zoiets moeten worden als dit:
code:
1
2
3
4
5
6
7
SELECT set_in_shop.*, shops.*
FROM set_in_shop INNER JOIN shops ON set_in_shop.shopid = shops.uid
WHERE set_in_shop.setid = 2 and 
set_in_shop.uid IN (SELECT max(tijdstmp), uid, shopid
FROM set_in_shop
WHERE setid = 2
GROUP BY shopid)


uiteraard werkt dit niet omdat IN maar een veld terug wil hebben, maar ik zal toch die max(tijdstmp) moeten selecteren en ergens moeten grouperen op shopid omdat ie anders gewoon de maximale tijdstmp van alle records geeft ipv de maximale tijdstmp per winkel.

Oohw ja, link naar de site: http://www.legopricewatch.tk/

[ Voor 4% gewijzigd door jopiek op 23-05-2005 11:20 ]

Cogito Ergo Credo


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Je subquery moet iets worden in de richting van: tijdstmp = (select max(tijdstmp) from ... where shopid = hoofdquery.shopid and setid = hoofdquery.setid

Who is John Galt?


  • jopiek
  • Registratie: September 2000
  • Laatst online: 06-05 15:04

jopiek

Tja... 'ns ff denken.

Topicstarter
justmental schreef op maandag 23 mei 2005 @ 11:35:
Je subquery moet iets worden in de richting van: tijdstmp = (select max(tijdstmp) from ... where shopid = hoofdquery.shopid and setid = hoofdquery.setid
Hmmm oohw ja, dat kan natuurlijk ook, ik ben weer te lang van de HTS af, universiteit is ook niet alles :)

Toch werkt dat ook niet, hij loopt te klagen dat ie door die GROUP BY twee resultaten wil teruggeven terwijl de subquery maar een mag teruggeven ivm de = in de where van de hoofdquery.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SQL-query: 

SELECT set_in_shop . * , shops . * 
FROM set_in_shop
INNER JOIN shops ON set_in_shop.shopid = shops.uid
WHERE (

set_in_shop.setid =2
)
AND (
tijdstmp = ( 
SELECT max( tijdstmp ) 
FROM set_in_shop AS setshop
WHERE setid =2
GROUP BY setshop.shopid ) 
)

[b]MySQL retourneerde:  

#1242 - Subquery returns more than 1 row [/b]

[ Voor 49% gewijzigd door jopiek op 23-05-2005 11:45 ]

Cogito Ergo Credo


  • jopiek
  • Registratie: September 2000
  • Laatst online: 06-05 15:04

jopiek

Tja... 'ns ff denken.

Topicstarter
Sorry voor de schop maar anders wordt het voor anderen die het als referentie willen gebruiken een rommeltje:

code:
1
2
3
4
5
SELECT set_in_shop.*, shops.*
FROM set_in_shop INNER JOIN shops ON set_in_shop.shopid = shops.uid
WHERE set_in_shop.tijdstmp IN (SELECT max(tijdstmp)
FROM set_in_shop AS setshop
WHERE setid = 2 GROUP BY setshop.shopid)


levert het gewenste resultaat op...

Gelukkig is die tijdstmp zo gedetailleerd dat ie altijd uniek is, anders zou het natuurlijk nog niet werken!!!

[ Voor 15% gewijzigd door jopiek op 23-05-2005 11:51 ]

Cogito Ergo Credo


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 05-05 21:36
Ik weet niet welk DBMS je gebruikt, maar als het MS SQL is, kan je 'm volgense mij beter schrijven als:
SQL:
1
2
3
4
5
SELECT <gegevens>
FROM <table1>
JOIN <table2> ON <join criteria)
JOIN (select <uniek veld>, max(<veld>) from <table2> group by <uniekveld>) AS x ON 
x.<uniekveld>=<table2>.veld


mocht bovenstaande niet duidelijk zijn (dan begrijp ik dat), maar zonder een duidelijke structuur kan ik 'm niet beter noteren. Het idee erachter is dat je bijv in de 2e join een compleet nieuwe tabel opbouwt met per shop de laatste timestamp. Deze tabel kan je dan joinen met je brontabellen om de juiste records te selecteren.

PS: Als je een duidelijkere select wil, geef dan even je structuur aan.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Volgens mij is het nog niet bijster correct? Wat doet bijvoorbeeld je group by in de subquery daar??

Ik heb het idee dat dit meer correct is.
code:
1
2
3
4
5
6
SELECT outset.*, shops.*
FROM set_in_shop outset INNER JOIN shops ON outset.shopid = shops.uid
WHERE outset.tijdstmp = (SELECT max(tijdstmp)
                 FROM set_in_shop AS inset
                 WHERE inset.setid = outset.setid -- of 2, wat je zelf al had
                  AND inset.shopid = outset.shopid)
Pagina: 1