M@rtinMedlem sedan dec. 19992 085 inlägg 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.
------------------
//M@rtin || Peachy.nu\\
ni taLar Bra laTiN
LarsGMedlem sedan dec. 200012 464 inlägg 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).
------------------
essentitia preter non sans multiplicandum
M@rtinMedlem sedan dec. 19992 085 inlägg 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 :l
------------------
//M@rtin || Peachy.nu\\
ni taLar Bra laTiN
LarsGMedlem sedan dec. 200012 464 inlägg 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
[Redigerat av LarsG den 04 nov 2001]
LarsGMedlem sedan dec. 200012 464 inlägg Jag funderar lite så får vi se.
------------------
essentitia preter non sans multiplicandum
LarsGMedlem sedan dec. 200012 464 inlägg 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.
------------------
essentitia preter non sans multiplicandum
M@rtinMedlem sedan dec. 19992 085 inlägg 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?
------------------
//M@rtin || Peachy.nu\\
ni taLar Bra laTiN
LarsGMedlem sedan dec. 200012 464 inlägg Nej, byt inte ut dom.
Jag förutsätter att alla kolumner som heter något med id är av samma typ.
------------------
essentitia preter non sans multiplicandum
LarsGMedlem sedan dec. 200012 464 inlägg 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]