webForumDet fria alternativet

Klurigt problem!

8 svar · 137 visningar · startad av M@rtin

M@rtinMedlem sedan dec. 19992 085 inlägg
#1

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
#2

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
#3

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
#4
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
#5

Jag funderar lite så får vi se.

------------------
essentitia preter non sans multiplicandum

LarsGMedlem sedan dec. 200012 464 inlägg
#6

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
#7

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
#8

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
#9

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]

148 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
145 ms — hämta tråd, inlägg och bilagor (db)