17. december 2004 - 12:06Der er
36 kommentarer og 2 løsninger
Joins til webshop
Hejsa, Jeg har altid rodet meget rundt i det med joins, og denne gang er jeg helt i hårdknude..
Jeg sidder og laver en webshop, og skal nu lave en søgefunktion til siden. Funktionen skal naturligvis søge imellem alle produkterne i tabellen "produkter".. Den skal søge på felterne "navn" og "beskrivelse"...
Mit problem er nu, at jeg vil have sorteret alle resultaterne efter producenten...
Jeg har alle producenterne liggende i en tabel der hedder "Producenter" og hvert produkt har et int felt som hedder "producent" og angiver id nummeret på den pågældende producent..
Nogle der kan hjælpe mig med hvordan min sql streng skal se ud??
select produkter.* from produkter inner join Producenter on Producenter.id=produkter.producent where (produkter.navn like '%søgeOrd%' or produkter.beskrivelse like '%søgeOrd%') order by Producenter.navn
Det der elsker jeg dig for fennec... det virker som det skal... næsten i hvert fald.. For lige nu lister den jo sådan set bare produkterne...
Det jeg vil er at liste producenterne, så der kommer en slags overskrift for hver producent.. og så under hver producent køre et loop mere, som lister de varer som laver et match på søgningen og som ligger under den pågældende producent.. :)
set rs1 = conn.execute("select * from Producenter order by name") do while not rs1.eof set rs2 = conn.execute("select * from produkter where producent="& rs1("id") &" order by name") response.write "Producent: "& rs1("navn") &"<br>" do while not rs2.eof response.write rs2("navn") &"<br>" rs2.MoveNext loop response.write "<br>" rs1.MoveNext loop
Hvis den tager lang tid (pga af mange læsninger fra databasen), kan det laves i en select, men så bliver det mere indviklet at udskrive.
set rs1 = conn.execute("select distinct Producenter.* from produkter inner join Producenter on Producenter.id=produkter.producent where (produkter.navn like '%søgeOrd%' or produkter.beskrivelse like '%søgeOrd%') order by Producenter.navn") do while not rs1.eof response.write "Producent: "& rs1("navn") &"<br>" set rs2 = conn.execute("select distinct produkter.* from produkter where (produkter.navn like '%søgeOrd%' or produkter.beskrivelse like '%søgeOrd%') and produkter.producent="& rs1("id") &" order by produkter.navn") do while not rs2.eof response.write rs2("navn") &"<br>" rs2.MoveNext loop response.write "<br>" rs1.MoveNext loop
dim lastProducent, thisProducent lastProducent = "" do while ... thisProducent = rs("Producent") if lastProducent <> thisProducent then 'skriv overskrift lastProducent = thisProducent end if 'Skriv produkter rs.MoveNext loop
Du får redundante data, men skal kun lave et hug i databasen
ldanielsen >> Bruger selv join metoden nogle steder fordi jeg så undgår 1000 select sætninger, men da jeg viser mine data i en tabel bliver udskrivningen lidt indviklet.
Vi kan jo lave den, bare for at vise den. Denne er med "<br>" (som ikke er så indviklet):
set rs1 = conn.execute("select distinct Producenter.name as pName, produkter.* from produkter inner join Producenter on Producenter.id=produkter.producent where (produkter.navn like '%søgeOrd%' or produkter.beskrivelse like '%søgeOrd%') order by Producenter.navn") do while not rs1.eof thisProducent = rs1("pName") if lastProducent <> thisProducent then response.write "Producent: "& thisProducent &"<br>" lastProducent = thisProducent end if response.write rs1("name") &"<br>" rs1.MoveNext loop
Også har jeg foreste tyvstjålet ldanielsen's skabelon til dette eks.
set rs1 = conn.execute("select Producenter.name as pName, produkter.* from produkter inner join Producenter on Producenter.id=produkter.producent where (produkter.navn like '%søgeOrd%' or produkter.beskrivelse like '%søgeOrd%') order by Producenter.navn") do while not rs1.eof thisProducent = rs1("pName") if lastProducent <> thisProducent then response.write "Producent: "& thisProducent &"<br>" lastProducent = thisProducent end if response.write rs1("name") &"<br>" rs1.MoveNext loop
set rs1 = conn.execute("SELECT producenter.name AS pName, produkter.* FROM produkter INNER JOIN producenter ON producenter.id=produkter.producent WHERE (produkter.navn LIKE '*afspiller*' OR produkter.beskrivelse LIKE '*afspiller*') ORDER BY producenter.navn")
set rs1 = conn.execute("SELECT producenter.name AS pName, produkter.* FROM (produkter INNER JOIN producenter ON producenter.id=produkter.producent) WHERE (produkter.navn LIKE '*afspiller*' OR produkter.beskrivelse LIKE '*afspiller*') ORDER BY producenter.navn")
Det skal være "producenter.navn AS pName". Der stod "name":
set rs1 = conn.execute("SELECT producenter.navn AS pName, produkter.* FROM (produkter INNER JOIN producenter ON producenter.id=produkter.producent) WHERE (produkter.navn LIKE '*cd*' OR produkter.beskrivelse LIKE '*cd*') ORDER BY producenter.navn")
Haha du har ret.. Har ellers kigget koden igennem 200 gange for den slags fejl.. ;) Men hvorfor udskriver min kode ikke noget?
set rs1 = conn.execute("SELECT producenter.navn AS pName, produkter.* FROM (produkter INNER JOIN producenter ON producenter.id=produkter.producent) WHERE (produkter.navn LIKE '*"&search&"*' OR produkter.beskrivelse LIKE '*"&search&"*') ORDER BY producenter.navn")
do while not rs1.eof thisProducent = rs1("pName") if lastProducent <> thisProducent then response.write "Producent: "& thisProducent &"<br>" lastProducent = thisProducent end if response.write rs1("navn") &"<br>" rs1.MoveNext loop
Fungerer fint hvis jeg laver en response.write search
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.