[SQL/MySQL]records ophalen die niet gekoppeld zijn aan child

Pagina: 1
Acties:

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Ik had een beetje te weinig plek in het titel vakje dus het is een beetje vaag omschreven. De echte vraag is dit: Hoe haal ik alle records uit een tabel op die niet gekoppeld zijn via een derde koppel tabel aan een bepaalde record uit een tweede tabel. Nu is deze vraag nog niet te beantwoorden zonder te weten hoe die tabellen er dan uit zien en dat is zo:

tabel1: id, name
tabel2: id, name, content
tabel3: id, tabel1_id, tabel2_id

De records die aan een bepaald record gekoppeld zijn haal ik zo op:
code:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
  tabel1.*
FROM
  tabel1,
  tabel2,
  tabel3
WHERE
  tabel1.id=tabel3.tabel1_id
AND
  tabel2.id=tabel3.tabel2_id
AND
  tabel2.id=3

Geen problemen hier dus. De vraag is dus hoe ik alle records uit tabel1 ophaal die niet aan record uit tabel2 met id 3 gekoppeld zijn. Het zal wel vrij simpel zijn, maar ik weet niet waar ik moet zoeken.

Noushka's Magnificent Dream | Unity


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:53
Of met een subquery, maar als je een MySQL versie hebt die nog geen subqueries ondersteunt met een OUTER JOIN waarop je dan checkt op een ID == NULL ofzo.

code:
1
2
3
4
select tabel1.*
from tabel1
LEFT OUTER JOIN tabel2 ON tabel1.id = tabel2.tabel1_id
WHERE tabel2.tabel1_id IS NULL

oid

https://fgheysels.github.io/


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

Beetje offtopic, maar waarom heeft je koppeltabel een eigen id voor de records? Ik neem aan dat de koppeling tussen de twee id's uit de eerste tabellen al uniek is, dus waarom een eigen id?

'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.


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
NMe84 schreef op 01 juni 2004 @ 12:17:
Beetje offtopic, maar waarom heeft je koppeltabel een eigen id voor de records? Ik neem aan dat de koppeling tussen de twee id's uit de eerste tabellen al uniek is, dus waarom een eigen id?
Omdat ik de koppeling ook nog wil (kunnen) verwijderen. En dat zou ik inderdaad ook kunnen doen via de twee andere ID's maar via een primary key is het sneller en ik hoe naar de pagina die de koppeling verwijderd maar 1 ID door te geven ipv. 2. En ik vind het netter persoonlijk.

Ik heb trouwens na even spelen met whoami's antwoord zelf de zeer simpele oplossing gevonden waarvan ik zelf nog steeds niet begrijp waarom ik er niet opkwam (waarschijnlijk een bruggetje in mijn hoofd die ik even kwijt was :D).

Dit is em:
code:
1
2
3
4
5
6
7
8
9
SELECT
  tabel1.*
FROM
  tabel1,
  tabel3
WHERE
  tabel1.id=tabel3.tabel1_id
AND
  tabel3.tabel2_id!=3

8)7 :+

Noushka's Magnificent Dream | Unity


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

Nu je probleem toch opgelost is ben ik ff zo vrij om nogmaals offtopic te gaan. :)
Michali schreef op 01 juni 2004 @ 12:25:
Omdat ik de koppeling ook nog wil (kunnen) verwijderen. En dat zou ik inderdaad ook kunnen doen via de twee andere ID's maar via een primary key is het sneller en ik hoe naar de pagina die de koppeling verwijderd maar 1 ID door te geven ipv. 2. En ik vind het netter persoonlijk.
Waarom zou het sneller zijn? Je kan ook twee velden PK maken, en dus je argument klopt niet helemaal. Het is idd wel zo dat er 2 checks zouden moeten komen ipv 1, maar persoonlijk heb ik dat wel over voor een datamodel zonder redundantie. Daarbij moet je in jouw geval UNIQUE afdwingen, anders krijg je overbodige data in je databeest.
Enneuh, ik vind het juist helemaal niet net als je een overbodig veld in je tabellen propt. :)

'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.


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Overbodig is het mischien wel, maar ik ben deze manier van werken gewend en het gaat erg goed tot nu toe. En in zo'n koppel tabelletje is een extra veld echt niet zo'n overkill. Mischien dat het wel nog aapas maar voor nu laat ik het wel even zo. En over die unique, kan dat ook over meerdere velden? (ik ben nog niet zo evaren met databases zoals je mischien wel merkt)

even dat met die uniques gechecked en dat werkt idd. thanks.

[ Voor 11% gewijzigd door Michali op 01-06-2004 12:57 ]

Noushka's Magnificent Dream | Unity


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

Michali schreef op 01 juni 2004 @ 12:54:
Overbodig is het mischien wel, maar ik ben deze manier van werken gewend en het gaat erg goed tot nu toe. En in zo'n koppel tabelletje is een extra veld echt niet zo'n overkill. Mischien dat het wel nog aapas maar voor nu laat ik het wel even zo. En over die unique, kan dat ook over meerdere velden? (ik ben nog niet zo evaren met databases zoals je mischien wel merkt)
Dat weet ik zelf ook niet (ik denk zelf van wel), maar je zal het hoe dan ook moeten afdwingen. Is het niet in je database zelf, dan zul je het wel moeten afdwingen in je programmacode.

'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.


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
NMe84 schreef op 01 juni 2004 @ 12:57:
[...]

Dat weet ik zelf ook niet (ik denk zelf van wel), maar je zal het hoe dan ook moeten afdwingen. Is het niet in je database zelf, dan zul je het wel moeten afdwingen in je programmacode.
Dat is juist de reden waarom ik dit topic opende. Ik vraag via een formulier welk record er gekoppeld moet worden. En dat mogen dan natuurlijk alleen records zijn die nog niet gekoppeld zijn aan een bepaald record. Met het afdwingen van een unique in de db heb ik een dubbele beveiliging.

edit:
code:
1
2
3
4
5
6
7
8
9
SELECT
  tabel1.*
FROM
  tabel1,
  tabel3
WHERE
  tabel1.id=tabel3.tabel1_id
AND
  tabel3.tabel2_id!=3

Dit lijkt eigenlijk toch niet helemaal de oplossing te zijn.

Stel in tabel1 zit:

1, abc
2, def

in tabel2 zit:

1, asdf
3, blaat

in tabel3 zit:

1, 1, 1
2, 1, 3
3, 2, 3

Dan wordt record uit tabel1 met abc toch geselecteerd omdat er een record in tabel3 zit waarvan tabel2_id niet gelijk is aan 3 (1 namelijk). Dan ben ik toch nog niet uit. :(

[ Voor 31% gewijzigd door Michali op 01-06-2004 13:09 ]

Noushka's Magnificent Dream | Unity

Pagina: 1