Avatar billede melted Nybegynder
18. februar 2003 - 12:56 Der er 31 kommentarer og
1 løsning

SQL m. 3 datatabeller og vis resultat

Jeg har 3 databasetabeller:

1) jobansogninger: jobID(autonumber), en masse andre felter...
2) person_uddannelser: uddID(number), jobID(number)
3) uddannelser: uddID(autonumber), uddName(text), uddType(number)

Mine behov:
1) Jeg skal kunne søge i jobansogninger udfra f.eks. flere uddID'er
2) På resultatsiden skal jeg kunne se personerne, samt alle de uddName's som de har
3) Skal kunne se antal resultater
4) Skal kunne se f.eks. 20 personer pr. side

Håber nogen ved hvordan jeg skal strikke en SQL-sætning sammen til dette og kunne vise resultaterne.

Jeg kan ikke helt gennemskue om det er simpelt eller kompleks, men det må da kunne lade sig gøre.

I må meget gerne spørge hvis der er noget jeg ikke har forklaret godt nok...
Avatar billede dk_akj Nybegynder
18. februar 2003 - 13:07 #1
select j.jobid, j.felt1, j.felt2 count(j.jobid) as antalhits from jobansogninger j, person_uddannelser p, uddannelser, u where u.uddid = p.iddid and p.jobid = a.jobid and u.uddid = 1234 group by j.jobid, j.felt1, j.felt2

//akj
Avatar billede mort-gib Nybegynder
18. februar 2003 - 13:11 #2
Hvilken DB ??
I oracle er det noget i retning af:
select ja."fornavn", ja."efternavn", udd.uddName, udd.uddType
from jobansoegninger ja, uddannelser udd, person_uddannelser pudd
where pud.uddid in ("dine uddid's")
and ja.jobid = pud.jobid
and udd.uddid = pud.uddid
/


-Men det skal sikkert fin pudses lidt... M$ SQL er lidt anderledes (behandler joints lidt anderledes :-))
Avatar billede vb-mo Nybegynder
18. februar 2003 - 13:18 #3
Du kan faktisk nøjes med at skrive forbogstavet fra dine tabeller men du kan læse mere på dette link :
http://www.ultimateasp.com/tutorial/sql.asp?SQLTutorial=MultipleTable&go.x=10&go.y=11
Der har du det hele beskrevet :o)
Avatar billede dk_akj Nybegynder
18. februar 2003 - 13:23 #4
Bare for ikke at skabe forviring.

vb-mo >> den går ikke.... man kan lave et alias i sin select:
.... from jobansogninger j, person_uddannelser p, uddannelser u ...

Herover fortæller jeg i sql'en at j = jobansøgningerm p = uddanelser osv.

// akj
Avatar billede vb-mo Nybegynder
18. februar 2003 - 13:26 #5
Ja ok der var jeg lidt for hurtig men det beskrives fint på det link jeg gav :o)
Avatar billede dk_akj Nybegynder
18. februar 2003 - 13:27 #6
Ja, Helt enig et meget fint eksempel.

//akj
Avatar billede melted Nybegynder
18. februar 2003 - 13:28 #7
Det er i Access...
Avatar billede vb-mo Nybegynder
18. februar 2003 - 13:29 #8
Og så var det et svar det skulle have været :o)
Avatar billede dk_akj Nybegynder
18. februar 2003 - 13:29 #9
Hov der er en fejl i mit eks:
Her er ver2.

select j.jobid, j.felt1, j.felt2 count(j.jobid) as antalhits from jobansogninger j, person_uddannelser p, uddannelser u where u.uddid = p.iddid and p.jobid = a.jobid and u.uddid in (1,2,3,4) group by j.jobid, j.felt1, j.felt2

Syntaxen herover virker i access.

//akj
Avatar billede vb-mo Nybegynder
18. februar 2003 - 13:31 #10
Ja men det virker fint på ms-sql husk blot på at med dato'er skal der ikke ## rundt om men ' ' istedet.
Avatar billede melted Nybegynder
18. februar 2003 - 13:38 #11
Hvis nu noget af det I skriver kan bruges, mangler jeg stadig en måde hvorpå jeg kan vise f.eks. 20 resultater pr. side og se antal resultater (f.eks. "1 til 20 ud af 854")
Avatar billede melted Nybegynder
18. februar 2003 - 13:40 #12
Samt at man udfor personerne kan se ALLE de uddannelser de har tilknyttet
Avatar billede dk_akj Nybegynder
18. februar 2003 - 13:42 #13
For at vise 1-20 af 123 skal du bruge paging her er et eksempel: http://www.asp101.com/samples/db_paging.asp?page=

//akj
Avatar billede melted Nybegynder
18. februar 2003 - 13:50 #14
Mit største problem er sådan set at kunne vise personerne med alle deres uddannelser. Min nuværende løsning giver nogle dubletter hvis nu personen har flere uddannelser. Dertil har jeg lavet et script i visnings-delen der fjerner dubletterne, men så går der ged i min paging-del, da der jo stadig er "for mange" records, men dubletterne bare ikke bliver vist.
Avatar billede melted Nybegynder
18. februar 2003 - 13:55 #15
dk_akj >>>

Der var vist nogle flere fejl i din sætning.
Ver3:

select j.jobid, j.fornavn, j.efternavn, count(j.jobid) as antalhits from jobansogninger j, person_uddannelser p, uddannelser u where u.uddid = p.uddid and p.jobid = j.jobid and u.uddid in (1,2,3,4) group by j.jobid, j.fornavn, j.efternavn

Ser ud til at være noget i den retning jeg skal bruge... skal lige fifle lidt mere med det...
Avatar billede melted Nybegynder
18. februar 2003 - 14:04 #16
...mangler dog stadig det med resultater og visning af uddannelser udfor personerne samt paging
Avatar billede dk_akj Nybegynder
18. februar 2003 - 14:09 #17
Det du gerne vil er:

Hans  Cand. Alt, Cand. Mere
Kurt  Cand. Også, Cand. Ikke, Vil. Gerne

istedet for:

Hans  Cand. Alt
      Cand. Mere

Kurt  Cand. Også
      Cand. Ikke
      Vil. Gerne

???
Avatar billede melted Nybegynder
18. februar 2003 - 14:12 #18
Ja - det tror jeg
Avatar billede dk_akj Nybegynder
18. februar 2003 - 14:13 #19
Så er løsningen svjv via script...

//akj
Avatar billede melted Nybegynder
18. februar 2003 - 14:14 #20
hvordan?
Avatar billede dk_akj Nybegynder
18. februar 2003 - 14:21 #21
Jeg har lavet noget som dette:

do while not rs.eof
personid = rs("personid")

set personrs = conn.execute ("select * from personuddannelser")
do while not personrs.eof
data = data & ", " & personrs("uddannelsesid")
personrs.movenext
loop

' her har du så alle uddannelser i en streng.
rs.movenext
loop

//akj
Avatar billede melted Nybegynder
18. februar 2003 - 14:26 #22
Så laver den jo et recordset for hver person, ik? Det kan hurtigt gå galt, hvis man vælger at ville se alle resultater, da det vil sige der skal laves omkring 1-2000 recordsets...
Avatar billede dk_akj Nybegynder
18. februar 2003 - 14:29 #23
Nej, meningen er at du laver et recordset (RS) som indeholder personer.

For hver person i RS
  find uddannelser han/hun har, og byg dem sammen i en string.
  Udskriv data for person
loop

//akj
Avatar billede melted Nybegynder
18. februar 2003 - 14:42 #24
Okay, men hvis jeg forstår det rigtigt, så laver den et recordset med personuddannelser for hver person, ik? Eller er jeg helt forkert på den?
Avatar billede dk_akj Nybegynder
18. februar 2003 - 14:50 #25
ja det gør den. Men du genbruger jo det rs så du får ikke xxx til at ligge i memory.

//akj
Avatar billede melted Nybegynder
18. februar 2003 - 15:49 #26
Tror jeg er ved at have løst det, men kom i tanke om at hvis der ikke bliver søgt på nogen uddannelser, så skal alle personer vises - også selv om de ikke har nogen uddannelser. Det gør de ikke nu... nu vises kun personer der har uddannelser tilknyttet...

Nogen forslag?

Hvordan giver jeg dig (akj) point? Du står ikke i boksen ved Accepter/afvis.
Avatar billede dk_akj Nybegynder
18. februar 2003 - 16:01 #27
Hvad med dette ??
<%
sql = "select ...... from .... where j.id = p.id ....." ' ikke noget med hvilke uddannelser

if uddannesler_valgt then
  ' der sættes lidt mere ind i where clause
  sql = sql &" and uddannelser in (7,9,13)
end if

' group by sættes på
sql = sql & " group by ....."

' den opbyggede sql udføres.

//akj
conn.execute (sql)

%>
Avatar billede melted Nybegynder
18. februar 2003 - 16:07 #28
Jeg prøver lidt senere, for jeg tror jeg er liiiiige ved at have set lyset :)
Avatar billede dk_akj Nybegynder
18. februar 2003 - 16:14 #29
Det sagde min onkel også da han gik gennem tunellen og toget kom..... ;o)

//akj
Avatar billede melted Nybegynder
18. februar 2003 - 21:04 #30
Har fundet ud af det :)
Avatar billede melted Nybegynder
18. februar 2003 - 21:05 #31
Selvom jeg har løst det på en meget anderledes måde, skal du alligevel have tusind tak for hjælpen!
Avatar billede dk_akj Nybegynder
19. februar 2003 - 07:18 #32
Selvtak

//akj
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