Vad hjälper det om du lagrar ämne i produkttabellen?
Hur många ämnen har du?
Om det inte är alltför många så kan man göra en union.
Jag har sett några generella lösningar,som är ganska komplexa, på det här problemet (och dom fungerar inte i Access).
8 svar · 159 visningar · startad av M@rtin
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.
Vad hjälper det om du lagrar ämne i produkttabellen?
Hur många ämnen har du?
Om det inte är alltför många så kan man göra en union.
Jag har sett några generella lösningar,som är ganska komplexa, på det här problemet (och dom fungerar inte i Access).
Lagrar jag ID:t på Ämnet i Produkt tabellen så behöver jag ju inte ta fram det från Kategoritabellen.
Jag har bara runt tre ämnen men det ska ju kunna variera.
Hur gör man med UNION då?
Jag använder Access
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.
Jag funderar lite så får vi se.
Nu har jag funderat
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.
Hmm.. Jag får typblandningsfel men ajg vet inte om jag bytt ut helt rätt. Får nästan ta och skapa en databas som ser ut exakt så här och testa det.
De här k s och t är det något jag ska byta ut eller?
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