LLarsGMedlem sedan dec. 200012 464 inlägg
En sak till, hur bör man egentligen namnge sina fält?
Jag föredrar att använda helt utskrivna ord. Förkortningar använder jag bara om det blir långa namn och då använder jag mer än en bokstav i förkortningen.
------------------
essentitia preter non sans multiplicandum
SsolbulleMedlem sedan mars 20015 287 inlägg Nej, jag fixar inte det här.
Om jag ska ta fram alla fakta på en film får jag inte till det om jag ska ha personer i en tabell samt relationerna i en annan.
Jag tycker det verkar som att jag måste loopa mig genom tabellen movie på något sätt eftersom jag i den har flera lika - fld_m_mtid (mao kopplingar till den speciella filmen.)
Jag får bara ut en post.
[r]svammmel...
(snurrade till det lite mer än vanligt...)
------------------
/solbulle
Hemmabio | Spelautomater | The Who
[Redigerat av solbulle den 14 dec 2001]
LLarsGMedlem sedan dec. 200012 464 inlägg Nej, i så fall får du göra en outer join där
select mt.*,p.*
from tbl_movie_title mt inner join
tbl_movie m on mt.fld_m_id = m.fld_m_id
left outer join tbl_person p
on m.fld_p_id = p.fld_p_id
Vad menar du med att du bara får ut en post? Hur ser presentationskoden ut?
------------------
essentitia preter non sans multiplicandum
SsolbulleMedlem sedan mars 20015 287 inlägg Med att jag bara får ut en post (var lite trött då med...) menar jag att jag får bara ut en post om jag inte loopar det hela, men det kanske är självklart(?)
Nu har jag gjort så här i alla fall:
Visa film nummer:
<a href="film.asp?Visa=ja&ID=1">1</a> |
<a href="film.asp?Visa=ja&ID=2"> 2</a> |
<a href="film.asp?Visa=ja&ID=3"> 3</a> |
<a href="film.asp?Visa=ja&ID=4"> 4</a> |
<a href="film.asp?Visa=ja&ID=5"> 5</a> |
<a href="film.asp?Visa=alla"> Alla (ej implenterad ännu...)</a> |
<p>
<%
Set connect = Server.CreateObject("ADODB.Connection")
connect.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("db5.mdb")
If Request.QueryString("Visa") = "ja" And Request.QueryString("ID") <> "" Then
visaID = Request.QueryString("ID")
SQL = "select mt.*, p.*, d.* from tbl_PersonDoingInAMovie d, tbl_movie_title mt, tbl_movie m, tbl_person p where mt.fld_mt_id = m.fld_m_id and m.fld_s_id = d.fld_s_id and m.fld_p_id = p.fld_p_id and mt.fld_mt_id = " & visaID &""
Else
SQL = "select mt.*, p.*, d.* from tbl_PersonDoingInAMovie d, tbl_movie_title mt, tbl_movie m, tbl_person p where mt.fld_mt_id = m.fld_m_id and m.fld_s_id = d.fld_s_id and m.fld_p_id = p.fld_p_id "
'SQL = "select mt.*, p.* from tbl_PersonDoingInAMovie d, tbl_movie_title mt, tbl_movie m, tbl_person p where mt.fld_mt_id = m.fld_m_id and m.fld_p_id = p.fld_p_id"
End If
Response.Write SQL
set rs = connect.execute(SQL)
found = not rs.eof
if found then
Response.Write "<p>"
'Do Until rs.EOF
Response.Write "<br>"
Response.Write "fld_mt_id: "
Response.Write rs("fld_mt_id")
Response.Write "<br>"
Response.Write "fld_mt_name: "
Response.Write rs("fld_mt_name")
Response.Write "<br>"
Response.Write "fld_p_firstname: "
Response.Write rs("fld_p_firstname")
Response.Write "<br>"
Response.Write "fld_p_id: "
Response.Write rs("fld_p_id")
Response.Write "<br>"
Response.Write "fld_p_bio: "
Response.Write rs("fld_p_bio")
Response.Write "<br>"
Response.Write "fld_s_id: "
Response.Write rs("fld_s_id")
Response.Write "<br>"
Response.Write "Description: "
Response.Write rs("Description")
Response.Write "<br>"
'rs.MoveNext
'Loop
rs.close
set rs = nothing
connect.Close
set connect = nothing
End if
%>
Jag har även lagt upp kod, exempel samt databas här. http://solbulle.digitalrice.com/wf/filmdatabas/kod.html
Mitt problem, som jag verkligen inte fattar hur man kan lösa med denna modell betår i av att hur ska jag göra för att tillsammans med en specifik film koppla samt få ut ur databasen alla inblandade personer, typ huvudroll, biroll, regissör, producent?
Putsningar på koden motttages gärna i övrigt. (Obs att alla Response.Write är temporära)
------------------
/solbulle
Hemmabio | Spelautomater | The Who
LLarsGMedlem sedan dec. 200012 464 inlägg Hur ser tabellen tbl_PersonDoingInAMovie ut. Varför finns den med alls?
Du borde lägga till en extra kolumn i tabellen tbl_movie i stället som innehåller vilken uppgift en viss person har i en film. Den kolumnen måste ingå i primärnyckeln då samma person kan göra flera saker i en film.
------------------
essentitia preter non sans multiplicandum
SsolbulleMedlem sedan mars 20015 287 inlägg Ok, det var det du menade i ditt tidigare inlägg. Jag trodde du repeterade det som mrblonde skrev om en extra tabell: tbl_PersonDoingInAMovie.
Ja, varför den finns med vet jag inte riktigt - försöker lära mig av er alla.
Själv hade jag från början en tabell med alla fakta om en specifik film och i den en kolumn för skådespelare, regissör mfl. När sen problemetr med flera personer som skådespelare mfl positioner dök upp fick jag klart för mig att det bästa är att ägga personerna i en egen tabell.
Mitt problem är då nu hur jag kopplar ihop en viss film med en viss skådespelare, regissör mfl.
Min spontan tanke var att i ett fält i tabelln för filmen göra en koppling till tabellen med personer.
Men tydligen(?) är det bästa att separat koppla ihop "alltihop" i en separat tabell: tbl_movie .
Har inte riktigt klart för mig varför det är det bästa sättet?
-Alltid lättare att göra något när man vet vad man gör och varför :)
Min tbl_movie ser nu ut så här:
tbl_movie
---------
- fld_m_id Räknare (int autonumber)
- fld_m_mtid Tal
- fld_s_id Tal
- fld_p_id Tal
Där fld_s_id är kopplat till vad en person är för något; skådespelare osv.
Hur man nu ska kunna koppla ihop flera personer med samma eller och olika sysslor är för mig en gåta!?!
Du borde lägga till en extra kolumn i tabellen tbl_movie i stället som innehåller vilken uppgift en viss person har i en film
Tycker det är ungefär det jag har gjort, eller?
Den kolumnen måste ingå i primärnyckeln då samma person kan göra flera saker i en film.
Hmm... det där med att samma person kan göra flera saker köper jag, men hur den ska ingå i primärnyckeln...? = stort frågetecken!
Jag får slutligen ta och tacka för tålamodet hos er/dig.
------------------
/solbulle
Hemmabio | Spelautomater | The Who
LLarsGMedlem sedan dec. 200012 464 inlägg Du behöver inte ha någon räknare i tabellen tbl_movie då kombinationen av fld_m_mtid, fld_s_id och fld_p_id är unik. Det jag menade var att dessa kolumner tillsammans utgör primärnyckel för tabellen.
tbl_movie
---------
- fld_m_mtid Tal
- fld_s_id Tal
- fld_p_id Tal
Om du tar filmen Zorn som ett exempel, där spelade Gunanr Hellström huvudrollen och var samtidigt regissör.
tbl_movieTitle
id!title
1!Zorn
tbl_persons
id!namn
1!Gunnar Hellström
2!Richard Wolff
3!Stig Grybe
4!Ghitte Nörby
tbl_s
id!syssla
1!Regissör
2!Huvudroll kvinnlig
3!Huvudroll manlig
4!Biroll kvinnlig
5!Biroll manlig
så skulle du i tbl_movie få följande
mt_id!p_id!s_id
1!1!1
1!1!3
1!2!5
1!3!5
1!4!2
I så fall borde den select du har fungera om du loopar igenom alla poster.
(Osäker på kvinnliga huvudrollen.;))
------------------
essentitia preter non sans multiplicandum
SsolbulleMedlem sedan mars 20015 287 inlägg Yes! Jag har till och med fått det att fungera! På tiden va?
Då var det bara det här med att man kanske skulle pröva sig på en join eftersom annars kan det ju knasa om det inte finns någon person i filmen. (i databasen)
Nu står jag med denna SQL-sats:
SQL = "select mt.*, p.*, d.* from tbl_PersonDoingInAMovie d, tbl_movie_title mt, tbl_movie m, tbl_person p where m.fld_m_mtid = mt.fld_mt_id and m.fld_s_id = d.fld_s_id and m.fld_p_id = p.fld_p_id and mt.fld_mt_id = " & visaID &""
och det vore bra om man kunde "bortse" från alla befattningar/personer om det är tomt i tbl_movie.
En join är väl svaret iofs, men det är även det över min förmåga hur jag får till det.
------------------
/solbulle
Hemmabio | Spelautomater | The Who
EemissionMedlem sedan dec. 19996 721 inlägg En join har du redan gjort,i och med relationerna (en INNER JOIN). Det du letar efter är en OUTER JOIN.
SQL = "select mt.*, p.*, d.* from tbl_PersonDoingInAMovie d, tbl_movie_title mt, tbl_movie m LEFT OUTER JOIN tbl_person p ON m.fld_p_id = p.fld_p_id where m.fld_m_mtid = mt.fld_mt_id and m.fld_s_id = d.fld_s_id and mt.fld_mt_id = " & visaID &""
SsolbulleMedlem sedan mars 20015 287 inlägg Inte trodde jag att jag skulle få ettsvar så snabbt vid denna tidpunkt. :)
Men tyvärr får jag ett felmeddelande på den koden:
Error Type:
Microsoft OLE DB Provider for ODBC Drivers (0x80004005)
[Microsoft][ODBC Microsoft Access Driver] Join expression not supported
???
------------------
/solbulle
Hemmabio | Spelautomater | The Who
LLarsGMedlem sedan dec. 200012 464 inlägg Du gör en (inner) join nu. Det du behöver är en outer join.
SQL = "select mt.*, p.*, d.* " & _
" from (( tbl_movieTitle mt left outer join tbl_movie m on m.fld_m_mtid = mt.fld_mt_id) " & _
" left outer join tbl_PersonDoingInAMovie d on m.fld_s_id = d.fld_s_id) " & _
" left outer join tbl_person p on m.fld_p_id = p.fld_p_id " & _
" where mt.fld_mt_id = " & visaID
------------------
essentitia preter non sans multiplicandum
SsolbulleMedlem sedan mars 20015 287 inlägg GULD! Det fungerade perfekt!
(ett tabellnamn felstavat.)
TACK TACK TACK!
(btw Bor ni två här? ;) )
------------------
/solbulle
Hemmabio | Spelautomater | The Who
[Redigerat av solbulle den 16 dec 2001]
PPatrikBMedlem sedan mars 20002 836 inlägg Tillbaka till denna gamla tråd *ler*
tbl_movie behöver inte räknarfältet, eftersom det är en ren relationstabell.
Plocka ut filmerna med en SQL sats som matchar skådespelar_id i relationstabellen
Det med räknar fältet kommer ju in när man vill ta fram det unika idet för att tex redigera, ta bort, ja, man kan ju ha lagt in personen på fel film så att säga då är det smidigt med ett unikt id :e
cya,
PatrikB
------------------
'## -- second place is the first looser -- ##'
ToonsterMedlem sedan feb. 20001 590 inläggÅterigen, räknaren behövs inte. Man kan ta bort alldeles utmärkt utan det.
När man tar bort tex. en skådespelare ur relationstabellen, så plockar man bort den skådespelarens unika id ur relationstabellen, för den aktuella filmesn unika id.
LarsG's tabeller är perfekta enligt normaliseringsreglerne, hade inte gjort det bättre själv... :)
/T
------------------
Jensen Ambassadör, mitt bästa köp! www.jensen.no
[Redigerat av Toonster den 18 dec 2001]
PPatrikBMedlem sedan mars 20002 836 inlägg Men för editering av ngn info i relationstabellen så blir det mindre att hålla reda på :e
cya,
PatrikB
------------------
'## -- second place is the first looser -- ##'
ToonsterMedlem sedan feb. 20001 590 inläggNej, relationstabellen kan man ändra/reigera precis lika bra ändå!
Finns inget som helst behov av unika poster i en relationstabell.
/T
------------------
Jensen Ambassadör, mitt bästa köp! www.jensen.no