[SQL] Dansparen

Pagina: 1
Acties:
  • 244 views sinds 30-01-2008
  • Reageer

  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 26-08 16:09
Ben bezig met een database voor een grote danswedstrijd. We hebben nu een DB met de deelnemers waarin ook aangegeven wordt wie met wie danst.

Even in het kort:

Deelnemers (D)
Nummer
Naam
etc..

Danstmet (DM)
Nummer
Nummerpartner

Nu wil ik dus een query bouwen die een lijst geeft van alle deelnemers plus de partner. Probleem is vooral dat die DM tabel 2 kanten op werkt. Het is niet zo'n probleem om de D tabel te joinen met de DM maar dan zie je maar van de helft van de mensen wat de partner is. Als bijvoorbeeld deelnemer 1 met 2 danst dan zie je wel dat 2 de partner is van 1 maar niet dat 1 de partner is van 2.

Ik heb nu dus iets als:

SELECT d.*, dm.*
FROM d left join dm on d.nummer=dm.nummer

dan krijg je dus als resultaat:

1 2
2
3 4
4

terwijl ik eigenlijk:

1 2
2 1
3 4
4 3

wil zien. Ding draait overigens in Access (ja, kan er ook niets aan doen ;)). Iets zegt me dat dit vrij gemakkelijk moet kunnen, m'n hersenen willen alleen niet helemaal meewerken, moet toch maar eens meer gaan slapen ofzo :z
Had eigenlijk gehoopt dat het voor mezelf wat duidelijker zou worden tijdens het typen van de posting en dat ik dus niets meer hoefde te plaatsen op GoT maar 't heeft niet veel geholpen :D

Heb ook al wat zitten spelen met het 2x joinen met de DM tabel maar het probleem is dan dat je in principe wel alle info uit je DB krijgt alleen dat je het dan niet fatsoenlijk kan presenteren. Je krijgt dan iets als:
code:
1
2
3
4
5
d.nr dm1.nr dm1.np dm2.nr dm2.np
1    1  2   
2           1   2
3    3  4
4           3   4

Dat is dus bijna niet fatsoenlijk weer te geven of je moet met een flinke hoop IF's in de weer..
Iemand een briljante ingeving?
1 1 2

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

Ik weet niet hoe je het wilt gaan representeren, maar het lijkt me niet zo moeilijk om dat goed te doen met die tweede query (dubbel gejoined). En eigenlijk had je natuurlijk het database ontwerp anders moeten doen. :)

Rustacean


  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 26-08 16:09
Ik wil iets maken als:

NaamDeelnemer NaamPartner

Dat is een beetje lastig met die dubbele join (lijkt mij). Probleem is namelijk dat je niet weet wat nou de naam van de partner is omdat er 2x gejoined is en je dus 2 mogelijkheden hebt. Je moet dus in de weer met IF's en dat vind ik nogal crappy eigenlijk ;)

Maar hoe had de DB dan in elkaar moeten zitten? Schema leek me niet eens zo brak eigenlijk.

Verwijderd

[quote]Op zaterdag 27 april 2002 12:30 schreef bartvb het volgende:
Ben bezig met een database voor een grote danswedstrijd. We hebben nu een DB met de deelnemers waarin ook aangegeven wordt wie met wie danst.
/quote]

offtopic:
Kom ik er met mijn vriendin ook in te staan? NDO?

  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 26-08 16:09
Gok van niet, gaat om het ETDS (European Tournament for Dancing Students) ;)

Verwijderd

Laat ik es een gok wagen, dit gaat om stijldansen? en dan Latin Dance? Ben zelf ook een Latin Master

  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 26-08 16:09
Ballroom en Latin, zie ook http://www.stud.tue.nl/~footloos/ ;)

Maar goed, dat helpt me allemaal niet veel verder met die @(*##@(&U query :P

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 27-08 13:53

chem

Reist de wereld rond

select *
from dm as a, dm as b
left join d_a on a.nummer = d_a.nummer
left join dm_a on a.nummer = dm_a.nummerpartner
left join dm_b on b.nummer = d_b.nummer
left join d_b on b.nummer = dm_b.nummerpartner

je hebt nu 2x de dm table met daaraan de dansergegevens en partnergegevens - toch?

niet getest maar misschien zoiets proberen

Klaar voor een nieuwe uitdaging.


  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Op zaterdag 27 april 2002 12:30 schreef bartvb het volgende:
Even in het kort:

Deelnemers (D)
Nummer
Naam
etc..

Danstmet (DM)
Nummer
Nummerpartner
SELECT D1.NUMMER, D1.NAAM, 'DANST MET', D2.NUMMER, D2.NAAM
FROM DEELNEMERS D1, DEELNEMERS D2, DANSTMET DM
WHERE D1.NUMMER=DM.NUMMER AND DM.NUMMERPARTNER=D2.NUMMER

Is dat wat?

Siditamentis astuentis pactum.


  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
Je kan heel mooi met aliassen werken in dit geval. Je krijgt dan iets in de trant van:
code:
1
2
3
4
SELECT d.naam, d2.naam
FROM deelnemers as d, deelnemers as d2, dansmet as dm
WHERE d.nummer=dm.nummer
AND d2.nummer=dm.nummerpartner

Dit is vast niet de correcte query, but you should get the picture...

The box said 'requires Windows 95 or better', so I installed Linux...


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 31-08 22:49
.

  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 31-08 22:49
code:
1
2
3
4
5
6
7
8
9
select d1.naam, d2.naam
from   d d1, d d2, dm
where  dm.nummer = d1.nummer
and    dm.nummerpartner = d2.nummer
union
select d1.naam, d2.naam
from   d d1, d d2, dm
where  dm.nummer = d2.nummer
and    dm.nummerpartner = d1.nummer

Is dit wat je zoekt?
edit:
ook de omgekeerde moest blijkbaar

Verwijderd

probeer es je DM-tabel met meer info te vullen op het moment dat je de invoer doet.. met 4 deelnemers dus ook 4 records in je DM-tabel, en je selecteert alleen daaruit...

Verwijderd

Zou het je helpen als een latin 2 danser langskomt op je wedstrijd, en een ballroom danser (nieuwe D style)

  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 26-08 16:09
Het is uiteindelijk gelukt, vooral door de UNION hint van Dash2in1 :D
Dit is um geworden, ben er zelf niet helemaal 100% blij mee, het kan wat eleganter lijkt me, maar het werkt ;)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
SELECT
  'query1',
  [D1.Voornaam] & " " & [D1.tv] & " " & [D1.Achternaam] AS Fullname,
  [D2.Voornaam] & " " & [D2.tv] & " " & [D2.Achternaam] AS Partner,
  U.Naam,
  DM.*
FROM
  (Deelnemers AS D2
  RIGHT JOIN (
    Deelnemers AS D1
    LEFT JOIN [Danst met] AS DM ON D1.Nummer = DM.Nummer
  ) ON (D2.Nummer = DM.Partnernummer)
) LEFT JOIN Universiteiten as U ON D1.Uninr = U.Uninr


WHERE
  D1.Nummer = DM.Nummer
  OR (DM.Nummer is NULL
    AND D1.Nummer NOT IN (SELECT Partnernummer FROM [Danst Met]))
UNION SELECT
  'query2',
  [D1.Voornaam] & " " & [D1.tv] & " " & [D1.Achternaam] AS Fullname,
  [D2.Voornaam] & " " & [D2.tv] & " " & [D2.Achternaam] AS Partner,
  U.Naam,
  DM.*
FROM
  (Deelnemers AS D2
  RIGHT JOIN (
    Deelnemers AS D1
    INNER JOIN [Danst met] AS DM ON D1.Nummer = DM.Partnernummer
  ) ON (D2.Nummer = DM.Nummer)
) LEFT JOIN Universiteiten as U ON D1.Uninr = U.Uninr
WHERE
  DM.Nummer <> D1.Nummer
ORDER BY U.Naam, Fullname, Partner;
Pagina: 1