[MySQL] Join met drie tabellen sorteren - kolommen samenvoeg

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • RePlayer
  • Registratie: September 2003
  • Laatst online: 18-09 23:19
Ik heb drie tabellen:
-relations
-relations_organisation
-relations_person

In de tabel relations wordt óf een organisation_id gegeven, of een person_id.

De uitkomst moet worden dat er een gecombineerde tabel met naam, plaats postcode etc. ontstaat waarbij het mogelijk is om op de verschillende kolommen te sorteren.

Maar als ik onderstaande Query uitvoer krijg ik in PhpMyAdmin 2 kolommen met de naam test te zien, en kan ik dus niet sorteren. Het lukt me niet om de velden name van beide tabellen tot één kolom te voegen.

Is Join hier überhaupt een goede oplossing?

Query:

SELECT relations_organisation.name AS test, relations_person.name AS test

FROM (relations
LEFT JOIN relations_organisation
ON relations_organisation.relation_organisation_id =
relations.relation_organisation_id )

LEFT JOIN relations_person
ON relations_person.relation_person_id =
relations.relation_person_id

---


Acties:
  • 0 Henk 'm!

  • killercow
  • Registratie: Maart 2000
  • Laatst online: 25-09 16:11

killercow

eth0

concat() is wat je zoekt

openkat.nl al gezien?


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Of je kan dit met UNION ALL doen, maar het blijven hacks. Ik zou eens kijken naar je database-design, volgens mij klopt daar iets niet...

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
RePlayer schreef op woensdag 10 december 2008 @ 18:27:
In de tabel relations wordt óf een organisation_id gegeven, of een person_id.
En toen stopte ik, with all due respect, met lezen. Hier zit al een knoert van een fout in je datamodel. Zorg dat je in 1 veld altijd alleen of appels, of peren stopt. Niet beide.

[ Voor 12% gewijzigd door RobIII op 10-12-2008 18:35 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • RePlayer
  • Registratie: September 2003
  • Laatst online: 18-09 23:19
Wat kan er verbeterd worden aan het databaseontwerp?

Er moet een lijst komen met relaties. De relatie kan óf een persoon, óf een organisatie zijn. Het leek me handig om die mogelijkheden op te splitsen in tabellen.

Is het beter om een (veel langere) tabel te maken genaamd relations die zowel de organisaties als de personen bevat?

Of is er nog een betere oplossing?

---


Acties:
  • 0 Henk 'm!

  • RePlayer
  • Registratie: September 2003
  • Laatst online: 18-09 23:19
RobIII schreef op woensdag 10 december 2008 @ 18:34:
[...]

En toen stopte ik, with all due respect, met lezen. Hier zit al een knoert van een fout in je datamodel. Zorg dat je in 1 veld altijd alleen of appels, of peren stopt. Niet beide.
Het ID zit wel in een apart veld.
Het veld relations.person_id wordt gevuld als de relatie een persoon betreft.
Het veld relations.organisation_id wordt gevuld als de relatie een organisatie betreft.
In het veld relations.type wordt aangegeven organisation of person

[ Voor 8% gewijzigd door RePlayer op 10-12-2008 18:44 ]

---


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
RePlayer schreef op woensdag 10 december 2008 @ 18:43:
[...]


Het ID zit wel in een apart veld.
Het veld relations.person_id wordt gevuld als de relatie een persoon betreft.
Het veld relations.organisation_id wordt gevuld als de relatie een organisatie betreft.
In het veld relations.type wordt aangegeven organisation of person
Oeh, crap; dat had ik verkeerd begrepen. My bad. Stond niet duidelijk in de TS. Your bad! :+

Je kunt toch gewoon beide tabellen left-joinen dan? en dat doe je al :X Ik heb mijn dag niet... Seriously :P Voor zover ik (nu :P ) zie is killercow in "[MySQL] Join met drie tabellen sorteren ..." dus je antwoord.

[ Voor 17% gewijzigd door RobIII op 10-12-2008 18:50 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • RePlayer
  • Registratie: September 2003
  • Laatst online: 18-09 23:19
Left joinen lukt inderdaad.

Het punt is dat ik person.name en relation.name in de uitvoer in één kolom wil krijgen, zodat ik kan sorteren.

---


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
RePlayer schreef op woensdag 10 december 2008 @ 18:42:
Is het beter om een (veel langere) tabel te maken genaamd relations die zowel de organisaties als de personen bevat?

Of is er nog een betere oplossing?
Nee, een goede oplossing is om velden die bij beiden voorkomen (address, postcode) ook in de tabel met alle relaties te zetten, in plaats van in beide tabellen afzonderlijk. Verder is het handig als je geen aparte ids hebt voor persoon en organisatie, maar dat deze beide gebruik maken van relatieid. Je krijgt dus iets als:

relatie(relatie_id, postcode, huisnummer, enz)
persoon(relatie_id (FK naar relatie), huwelijkse status, enz)
organisatie(relatie_id (FK naar relatie), KVK-nr, enz)

Aan de andere kant krijg je bij iets als de naam weer de vraag of je die apart moet doen (voornaam, achternaam, etc), of niet. Dat kun je dan alsnog oplossen met een union all.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • RePlayer
  • Registratie: September 2003
  • Laatst online: 18-09 23:19
Dat lijkt wel logisch. Ga ik proberen. Bedankt!

[ Voor 3% gewijzigd door RePlayer op 10-12-2008 19:33 ]

---


Acties:
  • 0 Henk 'm!

  • RePlayer
  • Registratie: September 2003
  • Laatst online: 18-09 23:19
Ik heb het databasedesign aangepast. Het zit nu logischer in elkaar. Union werd me te ingewikkeld.Onderstaande query werkt met behulp van CONCATvoor mij:

SELECT type, _mbev_relations_organisation.name, _mbev_relations_person.surname,
CONCAT (
IF ( _mbev_relations_organisation.name IS NULL,'',_mbev_relations_organisation.name ),
IF ( _mbev_relations_person.surname IS NULL,'',_mbev_relations_person.surname )
) as sortname, city, phone

FROM (_mbev_relations
LEFT JOIN _mbev_relations_organisation
ON _mbev_relations_organisation.relation_id =
_mbev_relations.id )

LEFT JOIN _mbev_relations_person
ON _mbev_relations_person.relation_id =
_mbev_relations.id

Bedankt voor jullie reacties!

---

Pagina: 1