[ASP/SQL] Inner Join dubbele records (ze zijn wel goed)

Pagina: 1
Acties:

  • MF
  • Registratie: April 2000
  • Laatst online: 19-05 13:38

MF

Take a Seat

Topicstarter
Hallo, ik zit met het volgende probleem. Ik ben bezig met het maken van een onlinefotoboek voor het bedrijf waar ik werk. (soort smoelenboek voor uitstapjes en dergelijke) Nu is er de mogelijkheid om voor 1 gebruiker meerdere foto's toe te voegen. Tot hier gaat alles goed.

Als volgende heb ik een overzicht gemaakt met daarin de naam van de gebruikers, hierin zou ik ook graag 1 foto van de gebruiker willen zien. Het probleem is echter dat ik probeer met een INNER JOIN de gegevens van de gebruiker en 1 van de foto's op te halen. Dit werkt ook goed, alleen iets te goed voor mijn doel :) hij laat namelijk voor elke treffer (INNER JOIN Foto ON User.ID = Foto.UserID) een record zien. Ik krijg dus een gebruiker net zo vaak in overzicht dan het aantal foto's wat deze gebruiker heeft.

Ik ben dus op zoek om het aantal records te beperken. Nu lukt het wel met DISTINCT of GROUP BY echter kan ik hiermee niet alle velden selecteren. (niet alle velden zijn gelijk, de datum van de Foto b.v., waardoor het niet als dubbele record word gezien)

De vraag is dus of hier een andere optie voor is dan met 2 selects te gaan werken en de inner join te vergeten?

Op google en op GoT heb ik niets kunnen vinden maar het lijkt me sterk dat dit niet kan.

  • dominic
  • Registratie: Juli 2000
  • Laatst online: 08-02 14:55

dominic

will code for food

Zou dit toch met een sub-select oplossen wanneer je echt maar 1 foto per gebruiker wil hebben.

Foto = (select TOP 1 [foto] from Foto where blaat blaat)

Download my music on SoundCloud


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 23:30

NMe

Quia Ego Sic Dico.

Dit kun je toch met ASP oplossen? Je kan toch kiezen om alleen wat met het eerste record te doen en daarna je recordset weer te sluiten? Of denk ik weer eens te simpel? :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • MF
  • Registratie: April 2000
  • Laatst online: 19-05 13:38

MF

Take a Seat

Topicstarter
NMe84 schreef op 04 maart 2004 @ 13:16:
Dit kun je toch met ASP oplossen? Je kan toch kiezen om alleen wat met het eerste record te doen en daarna je recordset weer te sluiten? Of denk ik weer eens te simpel? :?
Dat zou kunnen ja, maar dan moet ie bij 46 gebruikers 46 x open en dicht en dan gaat het niet al te snel worden. (ben ik bang)

  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
via

ASP:
1
2
FROM tbl_personeel
  LEFT JOIN tbl_fotos ON tbl_personeel.personeelID = tbl_fotos.personeelID


of als je elke keer een verschillende foto wilt hebben

ASP:
1
2
3
SELECT tbl_personeel.foo, 
(SELECT TOP 1 foto FROM tbl_fotos WHERE personeelID=personeelID 
ORDER BY newID();) AS foto


disclaimer: onderstonde heb ik niet getest

edit: newID() zorgt ervoor dat het resultaat uit de tbl_fotos op willekeurige manier wordt gesorteerd, is echter alleen beschikbaar in sql server...

[ Voor 22% gewijzigd door faabman op 04-03-2004 13:23 ]

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Twee oplossingen:

1) Je haalt alle records op (ook de dubbele) en laat in je ASP code alleen 1 record per personeelslid zien

2) met een subselect

code:
1
2
3
4
SELECT Personeel.Naam, Personeel.Woonplaats,
    (SELECT TOP 1 foto FROM Foto ORDER BY foto
     WHERE PersoneelsId = P.PersoneelsId) foto
FROM Personeel P

Oops! Google Chrome could not find www.rijks%20museum.nl


  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
NMe84 schreef op 04 maart 2004 @ 13:16:
Dit kun je toch met ASP oplossen? Je kan toch kiezen om alleen wat met het eerste record te doen en daarna je recordset weer te sluiten? Of denk ik weer eens te simpel? :?
dit moet je dus niet met asp oplossen, maar gewoon met je databeest, die is ervoor gemaakt...

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Waarom heb je ervoor gekozen om die foto's in een andere tabel op te slaan?
Ik kan me niet indenken dat je éénzelfde foto voor 2 verschillende personen gaat gebruiken?

Als je weet dat je een maximum aantal foto's hebt per persoon, kan je die foto's (of een verwijzing naar de foto op disk, het path dus), in de personen-tabel kwijt.
Indien het maximum aantal toch niet bekend is, werk je idd beter met een aparte tabel. Echter, wat je dan wel kunt doen, is een extra veld opnemen in de foto-tabel: nl. primaire_foto oid.
Je zorgt er dan voor dat voor iedere persoon die foto's heeft, er juist 1 record is in de foto tabel waarvoor primaire_foto op true staat. Dit is dan de 'belangrijkste' foto ofzo, en dan kan je makkelijk voor iedere persoon de belangrijkste foto ophalen met 1 sql statement.

https://fgheysels.github.io/


  • MF
  • Registratie: April 2000
  • Laatst online: 19-05 13:38

MF

Take a Seat

Topicstarter
whoami schreef op 04 maart 2004 @ 13:24:
Waarom heb je ervoor gekozen om die foto's in een andere tabel op te slaan?
Ik kan me niet indenken dat je éénzelfde foto voor 2 verschillende personen gaat gebruiken?

Als je weet dat je een maximum aantal foto's hebt per persoon, kan je die foto's (of een verwijzing naar de foto op disk, het path dus), in de personen-tabel kwijt.
Indien het maximum aantal toch niet bekend is, werk je idd beter met een aparte tabel. Echter, wat je dan wel kunt doen, is een extra veld opnemen in de foto-tabel: nl. primaire_foto oid.
Je zorgt er dan voor dat voor iedere persoon die foto's heeft, er juist 1 record is in de foto tabel waarvoor primaire_foto op true staat. Dit is dan de 'belangrijkste' foto ofzo, en dan kan je makkelijk voor iedere persoon de belangrijkste foto ophalen met 1 sql statement.
Het staat in 2 tabellen omdat ik totaal geen controle heb op de hoeveelheid foto's, iemand kan er 2 toevoegen of 30. Het idee met de primaire foto is wel een aardige. Zo voorkom ik dit probleem, echter ben ik wel benieuwt of het zou kunnen :)

  • MF
  • Registratie: April 2000
  • Laatst online: 19-05 13:38

MF

Take a Seat

Topicstarter
FvKnijff schreef op 04 maart 2004 @ 13:20:
ASP:
1
2
FROM tbl_personeel
  LEFT JOIN tbl_fotos ON tbl_personeel.personeelID = tbl_fotos.personeelID
Dit werkt volgens mij ook niet, want de LEFT en RIGHT join laten alleen de kolommen/records weg tussen welke geen link gelegd kan worden. De link kan in mijn geval echter wel gelegd worden.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
MF schreef op 04 maart 2004 @ 13:30:
[...]

Het staat in 2 tabellen omdat ik totaal geen controle heb op de hoeveelheid foto's, iemand kan er 2 toevoegen of 30. Het idee met de primaire foto is wel een aardige. Zo voorkom ik dit probleem, echter ben ik wel benieuwt of het zou kunnen :)
Waarom zou het niet kunnen?
Je zult er dan alleen wel moeten voorzorgen dat je voor iedere user altijd juist 1 'primaire foto' hebt, maar dat kan je makkelijk afdwingen op trigger niveau.

https://fgheysels.github.io/


  • MF
  • Registratie: April 2000
  • Laatst online: 19-05 13:38

MF

Take a Seat

Topicstarter
whoami schreef op 04 maart 2004 @ 13:49:
[...]


Waarom zou het niet kunnen?
Je zult er dan alleen wel moeten voorzorgen dat je voor iedere user altijd juist 1 'primaire foto' hebt, maar dat kan je makkelijk afdwingen op trigger niveau.
Ik bedoelde eigenlijk of mijn begin idee/vraag kan. Het idee van je primaire foto werkt 100% zeker en is ook het beste alternatief.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Ik bedoelde eigenlijk of mijn begin idee/vraag kan
[rml]P_de_B in "[ ASP/SQL] Inner Join dubbele records (ze..."[/rml]

Oops! Google Chrome could not find www.rijks%20museum.nl


  • MF
  • Registratie: April 2000
  • Laatst online: 19-05 13:38

MF

Take a Seat

Topicstarter
Danke, had ik gezien. Werkt ook perfect, zoals in mijn startpost aangegeven is die dubbele select ook een optie. Ik ben/was echter op zoek naar een soort van Kolom Distinct. (soort van: INNER JOIN Foto ON User.ID = EERSTE Foto.UserID)

Maar uit alle reacties begrijp ik al dat iets dergelijks er waarschijnlijk niet is. :'(
Pagina: 1