Avatar billede klas Juniormester
16. oktober 2006 - 17:51 Der er 10 kommentarer og
2 løsninger

udtrække data fra 2 database tabeller på een gang

Hejsa,

Jeg har en række emner som har fået tilføjet et kunstnerid - så man kan se hvem der har lavet de forskellige ting.

Den enkelte kunstner har så en personlig side, som der skal linkes til fra de emner han har lavet

under emner er der et felt som hedder kunstnerID - De kan bruges til at findekunstner navnet i kunstner tabellen i databasen.

Men hvordan vælger jeg i kunstner tabellen udfra en værdi fra emne tabellen?

altså fx:

select from kunstner where id="kunstnerID fra det aktuelle emne"

skriv lige hvis det skal forklares med eksempler :)
Avatar billede cpufan Juniormester
16. oktober 2006 - 19:30 #1
sql = "select * from kunster k, emne e where k.id = e.kunstnerid and e.id=" & den_pågældende_værdi
Avatar billede ldanielsen Nybegynder
16. oktober 2006 - 21:25 #2
Du skal lære at lave INNER JOINS:

SELECT Kunstner.Navn, Maleri.Navn FROM Maleri INNER JOIN Kunstner ON Maleri.KunstnerID = Kunstner.KunstnerID

Det giver dig en liste over alle malerier, med tilhørende kunstner.

Dette er hele fidusen ved at lave relaterede data. Find en god indføring i SQL for begyndere, så skal du bare se. SQL er ret let at lære, det er nok at lære ca. 10-15 udtryk, så er du rigtig godt med.
Avatar billede klas Juniormester
17. oktober 2006 - 10:15 #3
Det lyder fornuftigt nok, men jeg har vist ikke hjerne til at udføre det i virkeligheden - jeg har prøvet mig frem, og har fået den til at vise alle produkterne, med det rigtige link til den kunstner som har lavet dem - men det navn den skriver passer ikke til. De er også bare listet i rækkefølge ned af.

Kan man ændre noget i det her, eller er det helt galt ?:


<%
sqlBilleder = "SELECT * FROM billeder WHERE artNr=1 ORDER BY billedeID DESC"
Set rsBilleder = Conn.Execute(sqlBilleder)
sqlKunstner = "SELECT * FROM kunstner WHERE ORDER BY kunstnerNavn"
Set rsKunstner = Conn.Execute(sqlKunstner)
%>

<table background="grafik/pattern.gif" width="960" height="100%" cellspacing="0" cellpadding="0" border="0">
<tr>
    <td width="960" valign="top">
    <br><br>
        <%
Do While Not rsKunstner.Eof
Do While Not rsBilleder.EOF
    %>



    <table width="843" align="center" cellspacing="0" cellpadding="0" border="0">
<tr>
    <td width="123" height="123" valign="top"><a href="visemner.asp?which=<%=rsBilleder("billedeID")%>"><% response.write "<img border='0' align='left' src='../grafik/emner/" & rsbilleder("billede") &"'>"%></a></td>
    <td width="40" align="center" valign="top"><a href="profil.asp?ID=<%=rsBilleder("kunstnerID")%>"><img align="left" border="0"src="../grafik/kunstner/<% = rsKunstner("lportraet") %>"></a></td>
    <td width="680" valign="top"><a font class="brodgra" href="profil.asp?ID=<%=rsBilleder("kunstnerID")%>"><% = rsKunstner("kunstnerNavn") %>:</a></font><br>
    <font class="brod"><% response.write rsbilleder("danskTekst") %><br><br>
    Pris: <% response.write "DKK. " & rsbilleder("danskPris") %> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Størrelse: <% =rsbilleder("storrelse") %> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Status: <% =rsbilleder("status") %> </font></td>
</tr>
</table>
<center><img src="grafik/spacer.gif"></center>
<br><br>
<%
rsKunstner.movenext
rsBilleder.movenext
loop
loop
%>
Avatar billede cpufan Juniormester
17. oktober 2006 - 10:30 #4
<%
sqlBilleder = "SELECT * FROM billeder WHERE artNr=1 ORDER BY billedeID DESC"
Set rsBilleder = Conn.Execute(sqlBilleder)
sqlKunstner = "SELECT * FROM kunstner WHERE ORDER BY kunstnerNavn"
Set rsKunstner = Conn.Execute(sqlKunstner)
%>

<table background="grafik/pattern.gif" width="960" height="100%" cellspacing="0" cellpadding="0" border="0">
<tr>
    <td width="960" valign="top">
    <br><br>
        <%
Do While Not rsBilleder.EOF
sqlKunstner = "SELECT * FROM kunstner WHERE id = "&rsbilleder("kunstnerid")
Set rsKunstner = Conn.Execute(sqlKunstner)   
%>



    <table width="843" align="center" cellspacing="0" cellpadding="0" border="0">
<tr>
    <td width="123" height="123" valign="top"><a href="visemner.asp?which=<%=rsBilleder("billedeID")%>"><% response.write "<img border='0' align='left' src='../grafik/emner/" & rsbilleder("billede") &"'>"%></a></td>
    <td width="40" align="center" valign="top"><a href="profil.asp?ID=<%=rsBilleder("kunstnerID")%>"><img align="left" border="0"src="../grafik/kunstner/<% = rsKunstner("lportraet") %>"></a></td>
    <td width="680" valign="top"><a font class="brodgra" href="profil.asp?ID=<%=rsBilleder("kunstnerID")%>"><% = rsKunstner("kunstnerNavn") %>:</a></font><br>
    <font class="brod"><% response.write rsbilleder("danskTekst") %><br><br>
    Pris: <% response.write "DKK. " & rsbilleder("danskPris") %> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Størrelse: <% =rsbilleder("storrelse") %> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Status: <% =rsbilleder("status") %> </font></td>
</tr>
</table>
<center><img src="grafik/spacer.gif"></center>
<br><br>
<%
rsBilleder.movenext
loop
%>
Avatar billede klas Juniormester
17. oktober 2006 - 11:04 #5
tak for hjælpen  :)
Avatar billede ldanielsen Nybegynder
17. oktober 2006 - 12:10 #6
Jeg må protestere, der et slet ikke nødvendigt at åbne et nyt recordset for hvert billede. Det ville gå helt galt hvis du havde en side med mange besøgende:

<%
sqlBilleder = "SELECT BilledeID, KustnerID, Lportraet, KunstnerNavn, DanskTekst, DanskPris, Storrelse, Status FROM Billeder INNER JOIN Kunstner ON Billeder.KustnerID Kunstner.ID WHERE Billeder.artNr = 1 ORDER BY Billeder.BilledeID DESC"
Set rsBilleder = Conn.Execute(sqlBilleder)

%>

<table background="grafik/pattern.gif" width="960" height="100%" cellspacing="0" cellpadding="0" border="0">
  <tr>
    <td width="960" valign="top">
      <br><br>
        <%
Do While Not rsBilleder.EOF 
%>
  <table width="843" align="center" cellspacing="0" cellpadding="0" border="0">
    <tr>
      <td width="123" height="123" valign="top"><a href="visemner.asp?which=<%=rsBilleder("billedeID")%>"><img border="0" align="left" src="../grafik/emner/<%=rsBilleder("billede")%>"></a></td>
      <td width="40" align="center" valign="top"><a href="profil.asp?ID=<=rsBilleder("kunstnerID")%>"><img align="left" border="0" src="../grafik/kunstner/<%=rsBilleder("lportraet")%>"></a></td>
      <td width="680" valign="top"><a font class="brodgra" href="profil.asp?ID=<%=rsBilleder("kunstnerID")%>"><%=rsBilleder("kunstnerNavn")%>:</a></font>
        <br>
        <font class="brod"><%=rsBilleder("danskTekst")%>
        <br><br>
        Pris: DKK. <%=rsBilleder("danskPris")%>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        Størrelse: <%=rsBilleder("storrelse")%>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        Status: <%=rsBilleder("status")%></font></td>
    </tr>
  </table>
      <center><img src="grafik/spacer.gif"></center>
      <br><br>
<%
rsBilleder.movenext
loop
%>
    </td>
  </tr>
</table>
Avatar billede cpufan Juniormester
17. oktober 2006 - 12:39 #7
idanielsen - jeg giver fuldstændig ret....... ;>)
Avatar billede ldanielsen Nybegynder
17. oktober 2006 - 13:09 #8
Så forstår jeg ikke at du kommer med så tosset en løsning. Det havde dog været bedre at åbne billederne for sig, og kunstnerne for sig, og så for hvert billede at loope gennem kunstnerne til man fandt den rigtige.

Men jeg håber klas vil se på min løsning, og bruge den. Man kommer ikke udenom at lære SQL, og har man ikke hjerne til det, så skal man lave noget andet. Personligt tror jeg det er dovenskab, hvilket i sig selv er et tegn på intelligens ...
Avatar billede cpufan Juniormester
17. oktober 2006 - 13:20 #9
når du nu skyder på mig, kan du jo starte med at sætte dig ind i hvad jeg har forslået

16/10-2006 19:30:13

hvilket giver det samme som din innerjoin
Avatar billede ldanielsen Nybegynder
18. oktober 2006 - 10:24 #10
Det er sandt. Hvordan laver du i øvrigt et outer join, kan man også gøre det med den enklere syntaks?
Avatar billede cpufan Juniormester
18. oktober 2006 - 10:56 #11
jeg kan ikke huske hvad outer join går ud på?, da jeg altid benytter den anden syntax,
men hvis du forklarer i pseudokode, ?
Avatar billede ldanielsen Nybegynder
19. oktober 2006 - 11:31 #12
OK

Inner join:
Vælg fra tabel1 og tabel2 hvor der er relaterede data.

Outer join:
Vælg alt fra tabel1 og fra tabel2 hvis der er relaterede data.

Eksempel:

Kunde:
---------
KundeID Navn
------------ 
1      Hans
2      Jens
3      Anne

Ordre:
-----------
OrdreID KundeID
--------------
1      1
2      3
3      1
4      1


SELECT Kunde.Navn, Ordre.OrdreID FROM Kunde INNER JOIN Ordre ON Kunde.KundeID = Ordre.KundeID
Giver:
-----------
Navn OrdreID
------------
Hans  1
Hans  3
Hans  4
Anne  2

SELECT Kunde.Navn, Ordre.OrdreID FROM Kunde LEFT OUTER JOIN Ordre ON Kunde.KundeID = Ordre.KundeID
Giver:
-----------
Navn OrdreID
-----------
Hans  1
Hans  3
Hans  4
Jens  NULL
Anne  2

I et OUTER JOIN er der en hovedtabel, i et LEFT OUTER JOIN den der står til venstre i sætningen, her Kunde. Fra den vises alle poster, og såfremt der findes relaterede data, vises disse.

I INNER JOIN vises data kun hvis der findes relaterede data.

Som du ser vises Jens ikke i et inner join fordi kan ingen ordrer har.

Hvis du vil have en liste over kunder der ingen ordrer har skriver du:
SELECT Kunde.Navn, Ordre.OrdreID FROM Kunde LEFT OUTER JOIN Ordre ON Kunde.KundeID = Ordre.KundeID WHERE Ordre.OrdreID IS NULL

Hvis man alligevel skal lære "den svære syntaks" for at lave OUTER JOINS, så kan man lige så godt bruge den hele tiden. Den forekommer mig også at være mere præcis, idet joinoplysningerne står sammen med tabelangivelsen, og ikke sammen med de øvrige WHERE-argumenter
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

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