Avatar billede stigc Nybegynder
13. juni 2001 - 20:41 Der er 24 kommentarer og
2 løsninger

JOIN

Jeg troede jeg kunne lave det med en triviel JOIN
men kan ikke lige få det til at fungere.
Jeg har en tabel med en masse fugle og et id.
Så har jeg en user tabel med username og userid.
Så har jeg endnu en tabel med sammenkoblingen mellem fugle og user, så man kan se hvilke fugle en bruger har set.

Jeg skal bruge en liste med alle fugle, og samtidig et felt der fortæller om en bruger har set den. Følgende giver kun der fugle han har set:

SELECT bird.name,  hit.userid
FROM bird LEFT JOIN hit ON bird.birdid = hit.birdid
where hit.userid = 1

Hvordan får jeg alle andre med, og hvor hit.userid = null.


Avatar billede stigc Nybegynder
13. juni 2001 - 21:08 #1
Hvad hvis jeg gerne vil vælge de 2 sidste fugle
som hver bruger har set med et udtræk?
Avatar billede mugs Novice
13. juni 2001 - 22:01 #2
Hej stigc

det er jo utroligt hvad ornitologer roder sig ind i.!!!

Så vidt jeg kan se, er der en grundlæggende fejl i din database:

I tabellen \"fugle\" har du et id!
I tabellen \"user\" har du også et id!!

Disse id er forskellige, så databasen kan ikke umiddelbart sammenligne dem.

I tabellen \"fugle\" bør du lave feltet fugle til tabellens primære nøgle, idet du jo ikke vil have den samme fugl 2 gange.

Det samme i tabellen \"user\", du har kun een user med det samme navn.

Når du har gjort dette, skal du betragte disse tabeller som \"opslagsværker\", og i en 3. tabel der omhandler hvilke ornitologer der har set hvilke fugle, ved hjælp af kombinationsbokse plukke relevante oplysninger fra tabellerne.
Denne 3. tabel skal ikke have nogen primær nøgle.

Herefter trækker du i databasens relationsvindue de relevante relationer.

Jeg er overbevist om, at dit problem kan løses ved en ændring af databasens grundlæggende konstruktion. Dette vil komme dig tilgode senere hen.

Hvis din database er i Access 97, er du velkommen til at maile den til mig, så skal jeg se på den.

mugs@get2net.dk

Mvh / Mugs
Avatar billede stigc Nybegynder
13. juni 2001 - 22:26 #3
Tak for et uddybende svar!

Jeg har som du siger en primær nøgle både i user og bird tabellen. Desuden ingen i hit-tabellen der binder dem sammen. Jeg kan ikke rigtig forstå, hordan  du kan se jeg ikke har det? :)

Sender lige databasen....


Avatar billede stigc Nybegynder
13. juni 2001 - 22:27 #4
Husk lige at den JOIN jeg skrev på siden, slet ikke bruger  user tabellen endnu.
Avatar billede nih Novice
13. juni 2001 - 22:29 #5
Som jeg læser det har Stig en sådan tabel som kaldes Hit.

Man kan få præsenteret datane i tabellen Hit på en smart måde vha krydstabulering.

TRANSFORM Count(Hit.Birdid) AS AntalOfBirdid
SELECT Hit.Birdid
FROM Hit
GROUP BY Hit.Birdid
PIVOT Hit.userID;

Denne forespørgsel vil lave en kolone med alle dine fugle som række overskrift - Brugerne bliver listet op som koloneoverskrifter - Antal \"Hit\" vil placeres i de respektive felter.

SQL\'en er skrevet direkte ind, og skal måske rettes en smule - evt kan du joine de 2 andre tabeller ind således at Fuglenavnene og usernavnene skrives rigtig istedet for IDfelterne.
Prøv at lege lidt med krydstabulering - Den er god i alle tabeller med mange fremmednøgler.

Mugs >> Tak for dit kursusmaterial til access :o)

Niels
Avatar billede stigc Nybegynder
13. juni 2001 - 22:41 #6
nih> Ser smart ud og det virker også. Viste ikke man kunne dette. Er det ACCESS eller stadard SQL?

Men jeg kan ikke sætte en WHERE part på hvori jeg specificerer et userid. Det giver samme problem som min JOIN. Jeg mister fuglene som det angivet userid ikke har set.....
Avatar billede nih Novice
13. juni 2001 - 22:46 #7
Stig >

Du skal bare joine fugletabellen med som outerJoin - \"metag alle poster fratabelen bird\"

Så skulle alle fuglene gerne komme med :)

Niels
Avatar billede nih Novice
13. juni 2001 - 22:50 #8
Krydstabulering er foresten en speciel ACCESS SQL komando - Jeg kender den ikke fra SQL server, men det er også mest Access jeg bruger så måske er den gangbar i andre miljøer.

Du kan jo bagefter bruge din krydstabulering i andre forespørgsler og få (næsten) præcis det udtræk du vil have.

Niels
Avatar billede stigc Nybegynder
13. juni 2001 - 23:08 #9
problemet er WHERE parten hvor jeg siger userid=1, så fjerne den alle rækker med værien NULL. Dem vil jeg gerne beholde.
Avatar billede nih Novice
13. juni 2001 - 23:16 #10
Prøv den her

where hit.userid = 1 or hit.userid is null

Ellers skal du ikke angive nogen kriterier i din krydstabulering - og derefter lave udtrækkene herfra.

Avatar billede stigc Nybegynder
13. juni 2001 - 23:16 #11
og er der nogen der kan den her:

Hvad hvis jeg gerne vil vælge de 2 sidste fugle
som hver bruger har set med et udtræk?

Der er selvfølgelig et datofelt i hit-tabellen
Avatar billede mugs Novice
13. juni 2001 - 23:18 #12
Stig

Udkast til en ændring af din database er sendt.

Mvh / Mugs
Avatar billede stigc Nybegynder
13. juni 2001 - 23:18 #13
den har jeg også prøvet. Men den virker ikke, for hvis en anden user, har set den fugl, så står der ikke null, men hans userid, og så fanger \"isNull\" den ikke.
Avatar billede nih Novice
13. juni 2001 - 23:32 #14
Har Mugs løst problemmet, så vil jeg gerne høre de vise ord.
Jeg holder mig til min krydstabulering man kan jo trække MAX(datofelt) med som rækkeoverskrift.

select top 2 birdid, dato, 1
from Q_kryds;

den vælger userid 1\'s seneste 2 fugle

Hvis du undlader \"top 2\" findes alle fugle.

Niels
Avatar billede nih Novice
13. juni 2001 - 23:34 #15
PS:  ORDER by dato

Sorry klokken er mange ;o)
Avatar billede stigc Nybegynder
13. juni 2001 - 23:38 #16
hvordan sætter jeg det sammen?


select top 2 birdid, dato, 1
from Q_kryds;

og

TRANSFORM Count(Hit.Birdid) AS AntalOfBirdid
SELECT Hit.Birdid
FROM Hit
GROUP BY Hit.Birdid
PIVOT Hit.userID;



Avatar billede mugs Novice
13. juni 2001 - 23:38 #17
Stig

Så har jeg misforstået dig.

Tabellen \"hit\" er beregnet til at indtaste oplysninger om hvornår en user har set en fugl. Som du har skrevet i din sidste kommentar, forstår jeg det sådan, at du vil have oplysninger om hvornår en user ikke har set en fugl, og det er jo det modsatte af dit oprindelige spørgsmål.
Og det kan jeg ikke rigtig se nogen mening i.

Desuden mener jeg at udtrykket \"isNull\" er en betingelse du kan programmere i VBA, men ikke i en tabel.

Mvh / mugs 
Avatar billede stigc Nybegynder
13. juni 2001 - 23:45 #18
Nu må jeg hellere forklare mig klart. :)

Jeg ønsker et udtræk, der giver alle fuglene i tabellen. Dvs bare alle birdid\'er. Jeg ønsker dog lidt mere. Jeg ønsker at der for alle rækker, også fortælles om en bestemt user har set denne fugl.


Avatar billede nih Novice
13. juni 2001 - 23:51 #19
Stig>

følgende gemmes som Q_Kryds:
TRANSFORM Count(Hit.Birdid) AS AntalOfBirdid
SELECT bird.Birdid, Max(Hit.dato) AS maxdato
FROM bird LEFT JOIN Hit ON bird.BirdID = Hit.Birdid
GROUP BY Hit.Birdid
PIVOT Hit.userID;

Herefter opretter du endnu en forespørgsel

select top 2 birdid, maxdato, 1
from Q_kryds
order by maxdato;

Håber det hjælper


Avatar billede nih Novice
13. juni 2001 - 23:54 #20
Q_kryds er bare et billede af hele HIT-tabellen, som du så kan lave udtræk fra.
Jeg bruger tit krydstabulering - også til diagrammer osv.

Niels
Avatar billede nih Novice
14. juni 2001 - 00:00 #21
Mugs >>

er der copyright på dit musik kartotek som jeg fik igår - Hvis jeg vil bruge det bliver det kun internt hvor jeg arbejder - har du noget imod det ?????
Det er et flot stykke arbejde du har lavet!!!

Niels
Avatar billede mugs Novice
14. juni 2001 - 00:22 #22
Hej Niels

Der er intet copyright.

Jeg har haft meget glæde af det på mit arbejde - så hvis du kan bruge det, er jeg tilfreds med det. 

De første lektioner er jo noget tørt stof, men jeg har gjort en del ud af det fordi jeg af erfaring ved, at mange nye brugere springer det grundlæggende over, og går til det mere sjove som f.eks at få nogle smarte features / farver på formularer.

Mit kendskab til SQL og VBA og al det andet djævelskab I sidder og roder med er meget begrænset, men det grundlæggende med design af tabeller og relationer:

det er mig

Har du brug for yderligere materiale, skal du blot maile til mig:

mugs@get2net.dk


Mvh / Mogens
Avatar billede stigc Nybegynder
14. juni 2001 - 15:32 #23
Jeg er ked af at sige det, men jeg mener ikke jeg har fået svar på nogen af mine spørgmål.

nih  >> Dit med at finde de to nyeste fugle for hver person, virker ikke. Dit maxdato giver kun 1 dato per fugle, og jeg skulle gerne have end dato per fugl per mand, for atkunne finde de to nyeste.

Med hensyn til min database opbygning har jeg oprettet det her spørgsmål:

http://www.eksperten.dk/spm/81508

Avatar billede terry Ekspert
14. juni 2001 - 19:50 #24
stigc
If you still havent received an answer to your question then you can send the database to me and I will take a look.

dktebrsa@europe.lego.com
Avatar billede mugs Novice
14. juni 2001 - 20:14 #25
Hej igen igen

Jeg har sendt dig et et nyt udkast til en db, der giver dig:

Alle fugle samt et felt der viser om en user har set den.

Mvh / Mugs
Avatar billede stigc Nybegynder
24. august 2001 - 14:40 #26
lukker, og takker for indlæg
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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