Jag har tre tabeller i en databas som vi kan säga ser ut så här:
Ämne
- id
- namn
Kategori
- id
- namn
- ämne_id
Produkt
- id
- namn
- kategori_id
- sålda
Sedan vill jag välja välja de 5 översta produkterna (sorterade efter "sålda") från varje Ämne. Problemet är alltså hur jag ska gå igenom mellansteget smidigast så jag slipper lagra även Ämne i Produkten.
select * from (
select top 5 produkt.namn as produktnamn,ämne.namn as ämnesnamn,sålda from (produkt
inner join kategori on
produkt.kategori_id = kategori.id)
inner join Ämne on kategori.ämne_id = ämne.id where ämne.namn = 'IZI'
order by sålda
union
select top 5 produkt.namn ,ämne.namn,sålda from (produkt
inner join kategori on
produkt.kategori_id = kategori.id)
inner join Ämne on kategori.ämne_id = ämne.id where ämne.namn = 'AGRA'
order by sålda
) as s order by s.ämnesnamn,s.sålda
Tveksam om access klarar av en sådan fråga. Det enda som förenklar om du har med ämnesid är att du slipper en join.
------------------ essentitia preter non sans multiplicandum
select * from
(select (select count(*) + 1 from produkt,kategori,ämne
where kategori_id = kategori.kategori_id
and kategori.ämne_id = ämne.id
and ämne.id = s.id
and sålda > p.sålda) as rank, ämne.namn as ämne,
produkt.namn as produkt,sålda
from produkt as p,kategori as k,ämne as s
where p.kategori_id = k.kategori_id
and k.ämne_id = s.id
) as t
where t.rank <= 5
order by t.ämne, t.sålda desc
Helt otestat, då jag inte har någon Access.
------------------ essentitia preter non sans multiplicandum
Annars så går det ju att skriva en sån här kycklingvariant:
sql = "select id,namn from ämne order by namn"
set rs = connect.execute(sql)
while not rs.eof
sql = "select top 5 * from produkt where kategori_id in (select id from kategori where ämne_id = " & rs("id") & ") order by sålda desc"
set prs = connect.execute(sql)
if not prs.eof then
response.write rs("namn") & "<br>"
while not prs.eof
'visa produkter
prs.movenext
wend
end if
prs.close
set prs = nothing
rs.movenext
wend
------------------ essentitia preter non sans multiplicandum
[Redigerat av LarsG den 05 nov 2001]
255 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25