Avatar billede crapman Nybegynder
17. december 2004 - 12:06 Der 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??

Jeg bruger mySql.. ;)

Mvh Peter
Avatar billede fennec Nybegynder
17. december 2004 - 12:09 #1
select produkter.* from produkter inner join Producenter on Producenter.id=produkter.producent order by Producenter.navn
Avatar billede fennec Nybegynder
17. december 2004 - 12:11 #2
... Der manglede lige en where:

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
Avatar billede crapman Nybegynder
17. december 2004 - 12:14 #3
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.. :)
Avatar billede fennec Nybegynder
17. december 2004 - 12:20 #4
Så er der ingen grund til at joine...

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.
Avatar billede fennec Nybegynder
17. december 2004 - 12:23 #5
Glem det jeg lavede tidligere. Det skal være anderledes. 2 sek.....
Avatar billede fennec Nybegynder
17. december 2004 - 12:26 #6
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
Avatar billede ldanielsen Nybegynder
17. december 2004 - 12:27 #7
Fennec, jeg ville joine alligevel:

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

Forstår du?
Avatar billede fennec Nybegynder
17. december 2004 - 12:31 #8
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.
Avatar billede fennec Nybegynder
17. december 2004 - 12:39 #9
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.
Avatar billede crapman Nybegynder
17. december 2004 - 13:27 #10
Hehe okay... var lige til frokost...

Se det er fennec's sidste forslag (som så var stjålet fra Ldanielsen), som jeg skulle bruge..

Jeg kigger lige på det og vender tilbage...
Og så må Ldanielsen nok også hellere smide et svar, så han også kan få lidt af point'ene.. ;)
Avatar billede crapman Nybegynder
17. december 2004 - 13:30 #11
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][ODBC Microsoft Access Driver] ORDER BY clause (Producenter.navn) conflicts with DISTINCT.

/search.asp, line 7


Den fejl får jeg så... hvorefter det hurtigt går op for mig at jeg bruger Access til denne her opgave *DOH*... Er vidst lidt for vandt til mysql..

Kan det stadig lade sig gøre i access?
Avatar billede ldanielsen Nybegynder
17. december 2004 - 13:31 #12
nejtak, det ville vist være pirateri

Det er bare en lille ting jeg tit har brug for, og har vænnet mig til at bruge den metode. Bilder mig ind at det er mindre belastende for serveren ...
Avatar billede fennec Nybegynder
17. december 2004 - 13:33 #13
crapman >>
prøv at fjerne "distinct"

ldanielsen >>
Jeg synes nu du skulle have nogle point...
Avatar billede crapman Nybegynder
17. december 2004 - 13:34 #14
Bob bob... så får jeg...

Too few parameters. Expected 1.
Avatar billede ldanielsen Nybegynder
17. december 2004 - 13:34 #15
Order by kan jo ikke undværes, men det kan DISTINCT vist ...
Avatar billede ldanielsen Nybegynder
17. december 2004 - 13:34 #16
Nå, så lidt da :o)
Avatar billede fennec Nybegynder
17. december 2004 - 13:37 #17
Hvordan ser din kode ud nu???
Avatar billede crapman Nybegynder
17. december 2004 - 13:37 #18
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
Avatar billede crapman Nybegynder
17. december 2004 - 13:38 #19
Argh fuck doh!... det er vel søgeord der skal skiftes ud
Avatar billede crapman Nybegynder
17. december 2004 - 13:39 #20
næ vent, de er jo i plings.... hmm
Avatar billede fennec Nybegynder
17. december 2004 - 13:41 #21
Jeg mener da også access bruger % som wildcart...
Avatar billede ldanielsen Nybegynder
17. december 2004 - 14:31 #22
Næ, det da vist * ...
Avatar billede crapman Nybegynder
17. december 2004 - 14:33 #23
Underligt... jeg får stadig:

[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.

/search.asp, line 5
Avatar billede fennec Nybegynder
18. december 2004 - 20:55 #24
Hvilken kode står i linje 5???
Avatar billede crapman Nybegynder
20. december 2004 - 08:11 #25
Uha, så blev weekenden overstået...
Linje 5 er:

    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")
Avatar billede fennec Nybegynder
20. december 2004 - 08:32 #26
Prøv lige at smide en parentes om joinen:

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")
Avatar billede crapman Nybegynder
20. december 2004 - 08:33 #27
Får stadig Too few parameters. Expected 1.
Avatar billede fennec Nybegynder
20. december 2004 - 08:37 #28
Kan du overhoved selecte noget???

set rs1 = conn.execute("SELECT produkter.* FROM produkter")
Avatar billede crapman Nybegynder
20. december 2004 - 08:39 #29
Ja, det fungerer fint...
Avatar billede fennec Nybegynder
20. december 2004 - 08:42 #30
Hvad så uden where delen:

set rs1 = conn.execute("SELECT producenter.name AS pName, produkter.* FROM (produkter INNER JOIN producenter ON producenter.id=produkter.producent)")
Avatar billede crapman Nybegynder
20. december 2004 - 08:43 #31
Virker heller ikke :(
Avatar billede fennec Nybegynder
20. december 2004 - 08:50 #32
Det fatter jeg ikke....
Kan jeg hente databasen et eller andet sted?? Det vil vist gøre det lidt lettere at finde fejlen.
Avatar billede crapman Nybegynder
20. december 2004 - 08:52 #33
øhh bøhh.. ja det kan du vel.. Kan jeg sende den til dig? Er ikke helt vild med at smide den til offentlig download ;)
Avatar billede crapman Nybegynder
20. december 2004 - 08:58 #34
Jeg har smidt den på www.crapman.dk/art.mdb
Avatar billede fennec Nybegynder
20. december 2004 - 09:06 #35
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")

Så virker det ihvertfald her hos mig :o)
Avatar billede crapman Nybegynder
20. december 2004 - 09:12 #36
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
Avatar billede crapman Nybegynder
20. december 2004 - 09:16 #37
Aha, det var % i stedet for * i LIKE delen... ;)
Virker perfekt nu...

Mange mange tak for den kanone hjælp!!! :)
Avatar billede fennec Nybegynder
20. december 2004 - 09:19 #38
Det var så lidt, og tak for point.

.o) <-- One Eyed Jack
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester