[MySQL] Beginnersvraag joins - IDs aan namen koppelen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • monnick
  • Registratie: December 2005
  • Niet online
Ik heb een tabel met daarin allerlei films (tabelnaam = movies_user1), deze tabel heeft een aantal velden met daarin personen, verkort zoiets

code:
1
2
3
4
5
6
7
title      Pulp Ficton
director1  4
director2     
actor1     24
actor2     12
music1     2
music2


De nummers zijn unieke IDs van personen uit de tabel "persons". Deze tabel ziet er simpelweg uit als

code:
1
2
id       4
name     Quentin Tarantino


De vraag is nu uiteraard hoe ik gemakkelijk voor alle person IDs de bijbehorende person names krijg. Het lijkt me dat ik dit het beste kan doen met MySQL joins....alleen hoe?
Ik heb geen ervaring met joins, maar heb er net wel het één en ander over zitten uitzoeken. Ik kwam tot de conclusie om INNER JOIN te gebruiken, alleen dat wil niet echt lukken.

Het lukt even niet om de output van de SQL queries hier (gemakkelijk) weer te geven, maar door INNER JOIN te gebruiken krijg ik bijv het id en de naam van de film voor de rest van de filmtabel op welke ik de join toepas (beetje moeilijk om zo uit te leggen).

Iemand die me op weg kan helpen? :>

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Omdat sommige velden leeg zijn, zul je een outer join zoeken. Maar los daarvan zul je eerst je tabelopzet moeten wijzigen, want als je nummers in kolomnamen gebruikt dan is er iets mis.

[ Voor 0% gewijzigd door GlowMouse op 04-08-2010 12:27 . Reden: typo ]


Acties:
  • 0 Henk 'm!

  • BeRtjh
  • Registratie: Juli 2009
  • Laatst online: 16-07-2023
SELECT
movies_user1.title, persons.name
FROM
movies_user1,
persons
WHERE
persons.id = movies_user1.director1

In de WHERE koppel je nu de twee tabellen aan elkaar.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Ik heb geen ervaring met joins, maar heb er net wel het één en ander over zitten uitzoeken. Ik kwam tot de conclusie om INNER JOIN te gebruiken, alleen dat wil niet echt lukken.
Wat lukte er dan niet? Hoe ziet je query er uit?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
GlowMouse schreef op woensdag 04 augustus 2010 @ 12:25:
Maar los daarvan zul je eerst je tabelopzet moeten wijzigen, want als je nummers in kolomnamen gebruikt dan is er iets mis.
Niet per definitie, maar het wijst er wel vaak op ja. Ik stip het maar even aan voordat iemand het als harde waarheid opvat. Waar TS zich even in moet verdiepen is normaliseren.
BeRtjh schreef op woensdag 04 augustus 2010 @ 12:26:
In de WHERE koppel je nu de twee tabellen aan elkaar.
Gebruikt in vredesnaam gewoon joins met de join syntax (dus left/inner/outer/right/full join en niet in de where). Hoe werken joins?

[ Voor 30% gewijzigd door RobIII op 04-08-2010 12:58 ]

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!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Wanneer je nummertjes in je kolomnamen aan het opnemen bent dan is dat een teken dat je helemaal verkeerd bezig bent. In je vorige topic ben je al op koppeltabellen gewezen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Janoz schreef op woensdag 04 augustus 2010 @ 13:15:
Wanneer je nummertjes in je kolomnamen aan het opnemen bent dan is dat een teken dat je helemaal verkeerd bezig bent. In je vorige topic ben je al op koppeltabellen gewezen.
Niet per definitie, maar het wijst er wel vaak op ja. Ik stip het maar even aan voordat iemand het als harde waarheid opvat. Waar TS zich even in moet verdiepen is normaliseren.

Acties:
  • 0 Henk 'm!

  • monnick
  • Registratie: December 2005
  • Niet online
Oke, bedankt voor jullie reacties. Ik kan inderdaad beter eerst goed over mijn database structuur nadenken voordat ik ranzige dingen ga doen. Zal eerst eens gaan kijken naar koppeltabellen en even zoeken wat normaliseren is :)

EDIT: Wat is de Engelse naam voor "koppeltabel" ? :P linking tables gaf genoeg hits :)

[ Voor 17% gewijzigd door monnick op 04-08-2010 13:56 ]


Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
monnick schreef op woensdag 04 augustus 2010 @ 13:40:
Oke, bedankt voor jullie reacties. Ik kan inderdaad beter eerst goed over mijn database structuur nadenken voordat ik ranzige dingen ga doen. Zal eerst eens gaan kijken naar koppeltabellen en even zoeken wat normaliseren is :)

EDIT: Wat is de Engelse naam voor "koppeltabel" ? :P linking tables gaf genoeg hits :)
zijn mijn post hier:
http://gathering.tweakers.net/forum/view_message/34460067

@Roblll
wat is er mis met WHERE gebruiken? ik heb ergens gelezen dat MySQL dit intern toch optimaliseert naar JOIN en ik vind WHERE gewoon makkelijker te lezen.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
dragontje124 schreef op woensdag 04 augustus 2010 @ 14:07:
[...]

@Roblll
wat is er mis met WHERE gebruiken? ik heb ergens gelezen dat MySQL dit intern toch optimaliseert naar JOIN en ik vind WHERE gewoon makkelijker te lezen.
Het nadeel zit voornamelijk in de leesbaarheid. Daarnaast zit je automatich vast aan een inner join, en hebt dus minder flexibiliteit.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:51

Creepy

Tactical Espionage Splatterer

@dragontje124: met wat uitgebreidere queries zie je dan direct het verschil tussen een daadwerkelijke JOIN en je where conditie. Ook het verschil tussen de verschillende soorten JOIN's is duidelijker in de code als je de keywordt gebruikt i.p.v. het weg te stoppen in de where.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

GlowMouse schreef op woensdag 04 augustus 2010 @ 13:18:
Niet per definitie, maar het wijst er wel vaak op ja. Ik stip het maar even aan voordat iemand het als harde waarheid opvat.
Als ik er volgnummer van maak ipv nummer, is het dan wel per definitie fout? En als dat niet zo is, heb je daar een voorbeeld van?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Janoz schreef op woensdag 04 augustus 2010 @ 14:35:
[...]

Als ik er volgnummer van maak ipv nummer, is het dan wel per definitie fout? En als dat niet zo is, heb je daar een voorbeeld van?
Het aantal kan vantevoren vastliggen, zoals bij een tabel met pythagorese drietallen :)

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 20:09

Dido

heforshe

GlowMouse schreef op woensdag 04 augustus 2010 @ 15:22:
Het aantal kan vantevoren vastliggen, zoals bij een tabel met pythagorese drietallen :)
Daar hoef je er a) maar twee van op te slaan (flauw) en b) die wil je helemaal niet als getal1, getal2 en getal3 benoemen omdat je ze dan volgordelijk vastlegt, terwijl dat helemaal niet nodig is (en het levert bijvoorbeeld ranzige queries op als je alle records met getal1=12 of getal2=12 of getal3=12 gaat zoeken. Zelfs als je altijd drie getallen hebt kan het erg nuttig zijn ze gewoon in een aparte tabel op te nemen.

Als de genummerde items daadwerkelijk functioneel verschillen kun je ze aparte kolommen geven, maar dan zijn (meestal) de numertjes weer onzin.

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Dan kun je wel weer de getallen opslaan van klein naar groot :P

De derde waarde opslaan kan zeker nuttig zijn ivm efficiënte zoek- of sorteeracties. Een kolom die correspondeert met een bepaald volgnummer komt daarom ook best vaak voor (lapo of fipo in een topicstabel van een forum bijvoorbeeld). Dat de hele tweede tabel wordt weggelaten is wat minder gebruikelijk, maar er zijn zeker situaties te bedenken waarin het wel handig is. Bij opslag van de eerdergenoemde drietallen gaat de overhead per rij je behoorlijk parten spelen, en kost een extra tabel je zo 3x meer opslag- en geheugenruimte.

Acties:
  • 0 Henk 'm!

  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Creepy schreef op woensdag 04 augustus 2010 @ 14:12:
@dragontje124: met wat uitgebreidere queries zie je dan direct het verschil tussen een daadwerkelijke JOIN en je where conditie. Ook het verschil tussen de verschillende soorten JOIN's is duidelijker in de code als je de keywordt gebruikt i.p.v. het weg te stoppen in de where.
+1

Scheelt ook weer bugs, vergeet je een voorwaarde in je WHERE en je bent het bokje: Een cartegisch product.

Nog even een plaatje voor de verschillende soorten JOIN's:
Afbeeldingslocatie: http://www.codeproject.com/KB/database/Visual_SQL_Joins/Visual_SQL_JOINS_orig.jpg

Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Dies mooi :D

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router

Pagina: 1