[SQL] Normalisatie / joins problemen

Pagina: 1
Acties:

  • NLAnaconda
  • Registratie: Januari 2007
  • Laatst online: 03-07 12:42
Ten eerste excuses voor de titel. Geen idee hoe ik dit zou moeten omschrijven.
Mocht iemand een idee hebben, laat het me weten dan wijzig ik het zsm

Het gaat om het volgende. Ik heb een klein marktje gemaakt met 3 tabellen.

tabel1 - Huisjes
IDNaamGebruikersnaam
1Huis1Gebruiker1

tabel2 - Lampjes
IDNaamGebruikersnaam
1Lamp1Gebruiker1
2Lamp2Gebruiker1
3Lamp3Gebruiker1

tabel3 - Markt
IDKoppelidWatGebruikersnaam
11HuisGebruiker1
33LampGebruiker1

Het koppelid van de markt verwijst weer naar het id van het artikel (lamp of huis)

Stel, gebruiker1 wil weer eens een lampje verkopen.
Ik wil dan een lijst presenteren van lampjes die nog niet op de markt staan.

Ik doe dan:
SQL:
1
SELECT lampjes.id,markt.wat, lampjes.naam FROM lampjes INNER JOIN markt ON lampjes.id = markt.koppelid WHERE lampjes.gebruikersnaam = 'Gebruiker1'


Ik krijg dan dit terug
IDWatNaam
1HuisLamp1
2*niets*Lamp2
3LampLamp3


Ik deed dan
code:
1
2
3
If wat = "" then
* Opnemen in lijst met spullen die niet op de markt staan
end if


Maar zoals je ziet is de wat van lamp1 wel iets omdat hij dit gekoppeld heeft aan het koppelid van het huis. Terwijl lamp1 niet op de markt staat (Logisch)
Gevolg, lamp1 wordt niet in de lijst opgenomen.

Dus ik dacht ik plaats er het volgende bij
SQL:
1
WHERE markt.wat = 'Lamp'


Dan krijg ik dit terug
IDWatNaam
3LampLamp3


Dat klopt, want dat is de enige waar de markt.wat een lamp is. Maar zoals je ziet staan de niet ingeschreven artikelen niet in deze lijst.

Magoed, misschien voel je hem aankomen...
Hoe krijg ik in vredesnaam een lijstje met artikelen (bijv lampen) die NIET op de markt staan.

En als de oplossing real easy is voel ik me een }:O

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Lees je eens in over joins? en wellicht database-normalisatie. Hier klopt namelijk van-voor-tot-achter geen fluit van.

Titlechange:
[SQL] Geen idee voor titel >> [SQL] Normalisatie / joins problemen

Topicmove:
SEA >> PRG
Waar hoort mijn topic?

[ Voor 62% gewijzigd door RobIII op 27-05-2008 02:44 ]

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


  • ATS
  • Registratie: September 2001
  • Laatst online: 29-10 18:37

ATS

Waarom stop je precies lampjes en huizen in verschillende tabellen? Zijn het niet allebij gewoon artikelen? Hoe ga je je systeem uitbreiden als je een derde, een vierde, etc. artikel wil gaan toevoegen? Blijf je tabellen toevoegen?

Om resultaten te krijgen die niet in een andere tabel staan, kan je een subquery gebruiken in je WHERE: WHERE NOT IN. Je kan ook joinen en in je WHERE testen op NULL. Welke join je nodig hebt laat ik even over als oefening voor de TS.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 01:08
Je datamodel rammelt: je hebt nu in feite 2 relaties gelegd vanuit verschillende tabellen naar de kolom "koppelid", en als het ware de relatie ook in de tabel opgenomen ("Wat").
Ik begrijp overigens de context niet helemaal (markt/huis/lampje), heb je meerdere markten met lampjes in een huis? Of betreft het de huizenmarkt/lampenmarkt(/automarkt/***markt)? Heeft nogal invloed op je datamodel...

[ Voor 38% gewijzigd door sig69 op 27-05-2008 09:17 ]

Roomba E5 te koop


  • NLAnaconda
  • Registratie: Januari 2007
  • Laatst online: 03-07 12:42
Ten eerste bedankt voor de reactie's en de titel fix. _/-\o_

Het is geen officieele markt, maar gewoon om er wat mee te knooien.
RobIII schreef op dinsdag 27 mei 2008 @ 02:40:
Lees je eens in over joins? en wellicht database-normalisatie. Hier klopt namelijk van-voor-tot-achter geen fluit van.
Ik ga eens lezen thnx.
ATS schreef op dinsdag 27 mei 2008 @ 07:44:
Waarom stop je precies lampjes en huizen in verschillende tabellen? Zijn het niet allebij gewoon artikelen?
Nou er staan nog meerdere gegevens in die tabel zoals lengte, stroomverbruik, dimmer, voltage enz
Bij de huisjes staan nog weer andere specificaties. Daarom kon ik ze niet in 1 tabel knikkeren.
Misschien wat beter geweest om alle artikelen in 1 tabel te zetten met een verwijzing naar een andere tabel met specificaties?
sig69 schreef op dinsdag 27 mei 2008 @ 09:14:
Je datamodel rammelt: je hebt nu in feite 2 relaties gelegd vanuit verschillende tabellen naar de kolom "koppelid", en als het ware de relatie ook in de tabel opgenomen ("Wat").
De kolom "Wat" heb ik erin gezet zodat, als ik een artikel op wil halen, weet in welke tabel het moet kijken. Dus als je alle lampjes wilt zien dat je dan select .... from markt where wat = 'lamp'

Magoed ik ga eens even verder vogelen met jullie reacties

  • ATS
  • Registratie: September 2001
  • Laatst online: 29-10 18:37

ATS

Ik zou zeggen: abstraheren. Zoals je lampjes en huizen allebei artikelen zijn, zijn je lengte, stroomverbruik, inhoud, whatever allemaal properties van zulke artikelen. Die kan je ook in een tabel zetten en weer koppelen aan je artikelen. Dat is overigens niet altijd de meest efficiënte oplossing. Maargoed: inderdaad eerst helder maken wat precies wat is, dan eens goed nadenken over je data model.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • NLAnaconda
  • Registratie: Januari 2007
  • Laatst online: 03-07 12:42
Where not in werkt wel

Ik haal eerst alle id's van de ingeschreven lampjes op.
SQL:
1
SELECT koppelid FROM markt WHERE wat = 'lamp')


En dan haal ik de lampjes op die niet in die tabel staan
SQL:
1
SELECT lampjes.id,lampjes.naam FROM lampjes WHERE id NOT IN (SELECT koppelid FROM markt WHERE wat = 'lamp')


Ik snap dat ik moet normaliseren en ga me daar ook in verdiepen, maar is dit dan niet een goede oplossing?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
NLAnaconda schreef op dinsdag 27 mei 2008 @ 14:48:
maar is dit dan niet een goede oplossing?
Nee, dat is doorrommelen met de slechte basis die er in den beginne niet eens had mogen zijn. Daarbij is een subquery vele malen minder performanter dan een gewone simpele join.

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


  • NLAnaconda
  • Registratie: Januari 2007
  • Laatst online: 03-07 12:42
RobIII schreef op dinsdag 27 mei 2008 @ 15:25:
[...]

Nee, dat is doorrommelen met de slechte basis die er in den beginne niet eens had mogen zijn. Daarbij is een subquery vele malen minder performanter dan een gewone simpele join.
Duidelijke taal _/-\o_
Pagina: 1