webForumDet fria alternativet

Vad gör jag för fel? - Sök funktion

ASP

14 svar · 300 visningar · startad av mikael_a

Medlem sedan mars 2000475 inlägg
Frågan#1

Hej,

jag försöker få en databas att sortera sig i bokstavsordning. Jag har gjort en sida där det står A - Ö och alla är länkar som går till denna sida:


<%

	Set Connection = Server.CreateObject("ADODB.Connection")
	Connection.Open "driver={Microsoft Access Driver (*.mdb)}; DBQ="& Server.MapPath("../../databas/filmdatabas.mdb")
	SQLStmt = "SELECT * FROM film WHERE skadis_1 = '" & Request("bokstav") & "' order by titel DESC"

	Set RS = Connection.Execute(SQLStmt)
	%>

	<%
	If RS.EOF Then 
	response.write "hittar ingen skådespelare med denna bokstav."
	Else
	Do until RS.EOF
	%>

	<%=rs("ID")%>

   <%
	RS.MoveNext
	Loop
	RS.Close
	Connection.Close
	end if
	%>

och på själva bokstäverna (länkarna A - Ö) har jag följande kod [kod] c.asp?bokstav=c (för tex alla på C) men detta fungerar inte, det visar endast mitt medd. "det finns inga på bokstaven" vad gör jag för fel?

sedan skulle jag vilja söka i fler kolumer samtidigt, tex om man trycker på bokstaven C skall den söka i skadis_1, skadis_2, skadis_3 och skadis_4 jag har lekt med följande rad, men får inte ihop det. SELECT * from film where skadis_1, skadis_2, skadis_3, skadis_4 like reguest(bokstav) order by titel DESC.

tacksam för hjälp

------------------
Micke & Annas Sajt
micke@micke-anna.nu

Medlem sedan dec. 200012 464 inlägg
#2

Om du skriver så här i stället


SQLStmt = _
"SELECT * FROM film " & _
" WHERE skadis_1 like '" & _
Request("bokstav") & "%' " & _
" order by titel DESC"

Så borde du få alla vars namn börjar på den bokstav du skickar in.

Om du vill söka i flera kolumner så skriver du


SQLStmt = _
"SELECT * FROM film " & _
" WHERE skadis_1 like '" & _
Request("bokstav") & "%' " & _
" or skadis_2 like '" & _
Request("bokstav") & "%' " & _
" or skadis_3 like '" & _
Request("bokstav") & "%' " & _
" order by titel DESC"

Ps använd KOD och inte code i taggarna

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

Medlem sedan mars 2000475 inlägg
#3

Hej,

jag testade din "kod" snutt men och det verkar fungera, men om tex "sandra bullock" finns mer än en gång, skriver den ut hennes namn också mer än en gång... går det inte att göra så här tex:

sandra bullock (4)
christofer lambert (2)
keanu reves (1)

osv...?

och sedan att det går trycka på tex sandra, och alla filmer med henne dyker upp i ett nytt fönster.

------------------
Micke & Annas Sajt
micke@micke-anna.nu

Medlem sedan mars 2000475 inlägg
#4

Det verkar som om inte koden fungerar 100% jag får följande om jag trycker på bokstaven C

Amanda Roth
Christian Slater
Clint Eastwood
Corbin Bernsen
Corey Feldman
Gabrielle Anwar
osv...

1:a och sista namnet innehåller inga C,

------------------
Micke & Annas Sajt
micke@micke-anna.nu

Medlem sedan jan. 2001510 inlägg
#5

Jag skriver ju visserligen för MS SQL men jag skulle provat att skriva så här:

"SELECT * FROM film WHERE skadis_1 LIKE '%" & Request("bokstav") & "%' order by titel DESC"

så listar den alla som innehåller "bokstav" eller:

"SELECT * FROM film WHERE skadis_1 LIKE '" & Request("bokstav") & "%' order by titel DESC"

så listar den alla som börjar på "bokstav". Dock så vet jag inte om detta fungerar i Access men du kan ju alltid prova.

//JANspeed

Medlem sedan mars 2000475 inlägg
#6

Hej,

tack för ditt svar, det fungerar nästan men inte riktigt så som jag vill ha det.
...

SQLStmt = "SELECT * FROM film WHERE skadis_1 like '" & Request("bokstav") & "%' order by id DESC"
...

fungerar kanon, den visar alla som tex börjar på A.

men nu börjar problemet, jag har fler kolummer med skådespelare i, för filmerna innehåller ju mer än en person.

de har jag döpt till skadis_1 och skadis_2

använder jag följande kod:
...

'SQLStmt = "SELECT * FROM film WHERE skadis_1 like '" & Request("bokstav") & "%' " & " or skadis_2 like '" & Request("bokstav") & "%' order by titel DESC"

...

letar i båda kolumerna, men inte riktigt så som jag vill ha det...

tabellen ser ut enligt följande:

skadis_1 skadis_2
Al pachino robert de nero
adam sandler angela bassett
kevin costner anthony hopkins

söker jag enligt min ovanstående kod, får jag med båda två kolumerna även om det inte namnet i skadis_2 börjar på tex A

listan ser alltså ut enligt följande:

Al pachino
robert de nero
adam sandler
angela bassett
kevin costner
anthony hopkins

robert de nero + kevin coster skall inte visas de börjar inte på A.

och om namnet kommer 2 gånger går det inte att göra så att det räknas ihop? tex:
kevin coster (3)
adam sandler (1)

osv...

tacksam för hjälp.

------------------
Micke & Annas Sajt
micke@micke-anna.nu

Medlem sedan jan. 2001510 inlägg
#7

Problemet uppstår för att du har flera skådisar på samma rad eller i samma post (samma sak tror jag). När du sedan skriver ut en post så skriver den ut alla fälten i posten. dvs. film, skådis_1, _skådis_2, m.m.

Detta problemet uppstår för att du byggt databasen fel. Eftersom en film kan ha flera skådisar och en skådis kan vara med i flera filmer så bör du nästan bygga två tabeller som sedan är ihopkopplade på något sätt.

Det är två saker som löser detta problem som jag kan komma på och det är 1. Bygg om tabellen till två eller tre tabeller (vad jag skulle göra)
2. Gör om tabellen så att det enbart finns 1 skådis på varje rad. Det betyder att du troligtvis måste skriva in skådisen igen för varje film han är med i. Eller så kan du kanske klumpa ihop alla skådisarna per film i samma kolumn och fält och du får då kanske lista alla skådisar i filmen vid en sökning.

För att inte få dubletter så finns det ett kommando som heter DISTINCT men detta kommer troligtvis bara gälla för en och samma kolumn. Så har du samma namn i en kolumn så visar den bara ett av de namnen. Men har du samma namn i flera kolumner så visas namnet en gång i varje kolumn.

ex:

'SQLStmt = "SELECT DISTINCT * FROM film WHERE skadis_1 like '" & Request("bokstav") & "%' " & " or skadis_2 like '" & Request("bokstav") & "%' order by titel DESC"

Detta är bara vad jag tror för jag är nybörjare på det här. Det kan tänkas att någon annan har en bättre idé.

//JANspeed

[Redigerat av Janspeed den 04 apr 2001]

Medlem sedan mars 2000475 inlägg
#8

Hej,

tack för ditt svar.

jag får nog sätta mig och göra om tabellerna då.

har byggt om dem till två tabeller, film_1 och film_2 i dessa har jag följande information:

Titel, skadis, år, längd, band, kategori, köpfilm, blandat

samma info i båda förutom att kolumen skådis är olika (de ifrån skådis_1 och skådis_2) hur hade du byggt upp den?

http://www.micke-anna.nu/filmdatabas.zip

där finns allt för nedladdning.

jag vill att dubletterna skall räknas, och när jag trycker på den länken skall alla filmer den skådis varit med i listas, som jag skrev innan, jag har tex 9 filmer med Sandra bullock, och i tabellen film, kolumen skådis finns hon med 9 gånger, dessa vill jag inte skall radas upp en och en utan, vill helt enkelt att det skall stå:

Sandra bullock (9)

då ser jag enkelt att jag har nio filmer med henne.

går detta att fixa på ett enkelt sätt?

------------------
Micke & Annas Sajt
micke@micke-anna.nu

[Redigerat av mikael_a den 04 apr 2001]

Medlem sedan juli 2000103 inlägg
#9

Hoppas du inte har ngt emot att jag svarar istället. :)
Här kommer ett förslag på hur man kan bygga databasen:

Filmer
ID
Titel
Kategori
År
Längd
Band
Övrigt
Datum

Skådespelare
ID
Namn

Rollista
ID
FilmID
SkådespelarID

Filmer innehåller dina filmer, Skådespelare innehåller skådespelarna och Rollista knyter de olika skådespelarna till filmerna. På så sätt kan varje film ha hur många skådespelare som helst och du slipper fylla i skådespelarens namn på många ställen.

För att få ut skådespelare på rätt bokstav och antal filmer, med ovanstående databasdesign alltså, använder du följande SQL-sats:

"SELECT Skådespelare.Namn, Count(Rollista.ID) AS Antal FROM Skådespelare INNER JOIN Rollista ON Skådespelare.ID = Rollista.SkådespelarID GROUP BY Skådespelare.Namn HAVING Skådespelare.Namn LIKE '" & Request("bokstav") & "%'"

Namnet får du som kolumnen Namn och antalet filmer som en kolumn kallad Antal.

Osäker på om de svenska bokstäverna fungerar dock. Använder sällan sådana. :e

------------------
That you're paranoid doesn't mean you're not being monitored...
Monitora

[Redigerat av Dusty den 04 apr 2001]

Medlem sedan juni 20008 205 inlägg
#10

Liten vidareutveckling på Janspeeds svar...
Först skapar du en tabell som heter "film" eller något liknande klatschigt, som innehåller information om filmer. Därefter en som heter "skådespelare", som innehåller information om skådespelare.
Dessa båda kolumner ska ha någon slags primärnyckel. Räknare vore väl det mest naturliga...

Sen gör du en tredje tabell, "roll" eller någonting. Den representerar en roll som en skådespelare spelar i en film. Den måste ha minst två fält; ett som kan innehålla primärnyckel för skådespelare, och en som kan innehålla primärnyckel för film. Ponera att Star Wars har 15 som värde för primärnyckeln, och att Harrison Ford har 37 som värde för sitt primärnyckelfält, och att vi get roll tre fält, skådespelare_id, film_id och roll_namn:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
&#0124; skådespelare_id &#0124; film_id &#0124; roll_namn &#0124;
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
&#0124;       37        &#0124;    15   &#0124; Han Solo  &#0124;
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Detta är ett skolexempel på många-till-många-relationer... (sen kan man ju diskutera det faktum att Han Solo dyker upp i flera filmer, och hur man ska göra för att lösa det är en annan fråga ;) )

Nåja, med den här strukturen skulle det vara lätt att ange hur många filmer en skådis varit med i med följande:

SELECT COUNT(DISTINCT r.film_id) AS antal
FROM skådespelare s, roll r
WHERE s.skådespelare_namn = 'Harrison Ford' AND s.skådespelare_id = r.skådespelare_id

Har redan gjort en liknande databas som du kan flukta på... eller använda, om du har lust. All kopiering tillåten. http://www.dsv.su.se/~gustaf-c/filmer.zip

------------------
Life feeds on life feeds on life feeds on life feeds on life...

[Redigerat av spango den 04 apr 2001]

Medlem sedan juni 20008 205 inlägg
#11

Äsch, Dusty hann först ;)

------------------
Life feeds on life feeds on life feeds on life feeds on life...

Medlem sedan juli 2000103 inlägg
#12

Jäss! :e

I stort sett samma lösning, enda skillnaden var SQL-syntaxen.

Rollnamn är iofs tufft, men komplicerar ju saken lite. En skådespelare kan ju ha flera roller i samma film, och då måste man joina alla tre tabellerna för att kunna räkna antalet filmer han/hon har varit med i. :p

------------------
That you're paranoid doesn't mean you're not being monitored...
Monitora

[Redigerat av Dusty den 04 apr 2001]

Medlem sedan mars 2000475 inlägg
#13

Hej,

tack för alla svaren.

Dusty:
Nejdå, du är välkommen att komma med svar. Som ni nog redan har märkt är jag nybörjare på detta. Men det är skoj att försöka, något kanske man lär sig :) Men hur gör jag kopplingen mellan de olika tabellerna? så att t.ex. Harrison ford är med i Star wars? så att inte de säger att Sean conery är med i den. eller en koppling tvärt om... om jag söker på Sean conery skall inte Star wars Dyka upp. sköter detta sig själv genom film_id och skådespelare_id? och vad händer om samma skådis är med mer än en gång? får den ett nytt id? jag har över 1400 filmer att lägga in, och jag orkar inte skriva in dessa för hand, de finns i ett excel register nu.

Spango: tackar för ditt svar, jag skall kolla på din .zip fil. Du kan läsa mitt svar till Dusty, du kanske har någon ide?

------------------
Micke & Annas Sajt
micke@micke-anna.nu

Medlem sedan jan. 2001510 inlägg
#14

Hmm... Återigen hänvisar jag till mina sådär halvbra SQL kunskaper men i SQL så går det först och främst alldeles utmärkt att importera Excel-blad och jag är 99% säker att det går utmärkt i access också.

Sedan går det även i SQL att välja vilken tabell respektive kolumner ska hamna i när man importerar datat och dessutom i vilken kolumn i denna tabell. Så det skulle förvåna mig om det inte gick att göra nått liknade i Access.

[Redigerat av Janspeed den 05 apr 2001]

[Redigerat av Janspeed den 05 apr 2001]

Medlem sedan juli 2000103 inlägg
#15

Varje skådespelare har bara ett ID. För varje film en skådespelare är med i får han/hon en post i rolltabellen. Där skriver du vad filmen har för ID och vad skådespelaren har för ID, och eventuellt vilken roll han/hon spelar. Detta görs dock inte automatiskt när du importerar din stora, onormaliserade tabell från Excel, men man kan kanske skriva ett antal SQL-frågor eller ett ASP-script som gör det. Annars blir det till att lägga till posterna för hand.

------------------
That you're paranoid doesn't mean you're not being monitored...
Monitora

[Redigerat av Dusty den 05 apr 2001]

256 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
118 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)