[MySQL] joinen van x aantal tabellen

Pagina: 1
Acties:

  • BlaTieBla
  • Registratie: November 2000
  • Laatst online: 01-09 07:33

BlaTieBla

Vloeken En Raak Schieten

Topicstarter
Ik ben bezig om al mijn software in een MySQL database te gooien en heb daar de onderstaande indeling in gemaakt [In tabel 1 zijn er wel meerdere entries, maar die zijn in dit verhaal niet van belang].
code:
1
2
3
4
5
6
7
8
9
Databasenaam: Software
Tabel 1 [Software]:
Id  SoftwareNaam    FabrikantId CategoryId

Tabel 2 [Fabrikant]:
FabrikantId FabrikantNaam

Tabel 3 [Category]:
CategoryId  FabrikantId CategoryNaam

De reden, dat ik het zo heb gedaan is dat een fabrikant meerdere software pakketten op de markt kan brengen en dat die weer in verschillende categorien onder te verdeln zijn.
bijv. Microsoft brengt o.a. MS Office 2000 en MS Windows XP uit. alle bij van MS, maar verschillende categorien. Qua naam zijn ze uniek, want ik moet nog een andere fabrikant tegenkomen, die een MS Office 2000 op de markt brengt.

Als ik nu zou gaan zoeken in die database, is dat het netste om dat op basis van join statements te doen. Nu ligt daar zeg maar mijn probleem.

Ik krijg namelijk op met geen mogelijkheid die drie tabellen ge-joined. 2 is geen probleem met bijv. een left join.

Wat ik werkende krijg is het onderstaande:
code:
1
2
3
4
5
6
7
8
9
10
11
select
  Software.SoftwareNaam,
  Software.Fabrikant,
  Category.Category

from
  Software
  left join Category on Category.CategoryId = Software.CategoryId

where
  Software.SoftwareNaam = 'MS Office 2000'

Wat ik ook aan combinaties van join etc. toepas, het enige wat ik extra terug krijg is de eerste fabrikant, die ook wat heeft uitgebracht in die betreffende categorie en niet de echte leverancier / fabrikant.

Wie oh wie weet raad??

B.t.w. op google is een hoop over join statement te vinden, maar gaat niet verder dan het joinen van 2 tabellen.

leica - zeiss - fuji - apple | PSN = Sh4m1n0


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

vervang die where es (letterlijk in dit geval) door 'and'

[edit]
Laat ik de vraag es beter lezen ;)

Dit kan toch gewoon zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
select
  Fabrikant.FabrikantNaam, 
  Software.SoftwareNaam,
  Software.Fabrikant,
  Category.Category
from
  Software, category, fabrikant
where
  software.categoryid = category.categoryid
  AND
  software.fabrikantid = fabrikant.fabrikantid
  AND
  Software.SoftwareNaam = 'MS Office 2000'

?

Waarom heeft je category trouwens een fabrikantid ?

  • BlaTieBla
  • Registratie: November 2000
  • Laatst online: 01-09 07:33

BlaTieBla

Vloeken En Raak Schieten

Topicstarter
Op maandag 22 juli 2002 21:27 schreef ACM het volgende:

Waarom heeft je category trouwens een fabrikantid ?
Om te kunnen kijken welke fabrikanten op welke gebieden software op de markt brengen.

leica - zeiss - fuji - apple | PSN = Sh4m1n0


  • BlaTieBla
  • Registratie: November 2000
  • Laatst online: 01-09 07:33

BlaTieBla

Vloeken En Raak Schieten

Topicstarter
Op maandag 22 juli 2002 21:27 schreef ACM het volgende:
vervang die where es (letterlijk in dit geval) door 'and'

[edit]
Laat ik de vraag es beter lezen ;)

Dit kan toch gewoon zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
select
  Fabrikant.FabrikantNaam, 
  Software.SoftwareNaam,
  Software.Fabrikant,
  Category.Category
from
  Software, category, fabrikant
where
  software.categoryid = category.categoryid
  AND
  software.fabrikantid = fabrikant.fabrikantid
  AND
  Software.SoftwareNaam = 'MS Office 2000'

?

Waarom heeft je category trouwens een fabrikantid ?
Dat where ... and ... and ... verhaal is het probleem niet zozeer. Ik heb ooit eens begrepen, dat het netter / sneller is om het d.m.v. van join's te doen.

leica - zeiss - fuji - apple | PSN = Sh4m1n0


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op maandag 22 juli 2002 21:36 schreef BlaTieBla het volgende:

[..]

Om te kunnen kijken welke fabrikanten op welke gebieden software op de markt brengen.
Dat kun je toch ook/beter via de software-tabel achterhalen?

  • BlaTieBla
  • Registratie: November 2000
  • Laatst online: 01-09 07:33

BlaTieBla

Vloeken En Raak Schieten

Topicstarter
Op maandag 22 juli 2002 21:37 schreef ACM het volgende:

[..]

Dat kun je toch ook/beter via de software-tabel achterhalen?
Je bedoel om de fabrikant naam in de softwaretabel te zetten?

leica - zeiss - fuji - apple | PSN = Sh4m1n0


  • sverzijl
  • Registratie: Januari 2001
  • Laatst online: 12:53
Op maandag 22 juli 2002 21:37 schreef BlaTieBla het volgende:

[..]

Dat where ... and ... and ... verhaal is het probleem niet zozeer. Ik heb ooit eens begrepen, dat het netter / sneller is om het d.m.v. van join's te doen.
Sneller in ieder geval niet, want alleen de notatiewijze verschilt (alleen ACM gaf als voorbeeld een innner join en jij gebruikt een (left) outer join. Outer joins zijn wel trager dan inner joins).
Netter is het wel, omdat je join clausules van je gewone where clausules afscheidt waardoor het beter leesbaar is.


Maar dit zou gewoon moeten werken hoor :
code:
1
2
3
4
5
6
7
8
9
10
select
  Software.SoftwareNaam,
  Software.Fabrikant,
  Category.Category
from
  Software
  left join Category on Category.CategoryId = Software.CategoryId
  left join Fabrikant on Fabrikant.FabrikantID = Software.FabrikantId
where
  Software.SoftwareNaam = 'MS Office 2000'

  • BlaTieBla
  • Registratie: November 2000
  • Laatst online: 01-09 07:33

BlaTieBla

Vloeken En Raak Schieten

Topicstarter
Op maandag 22 juli 2002 21:43 schreef sverzijl het volgende:

[..]

Sneller in ieder geval niet, want alleen de notatiewijze verschilt (alleen ACM gaf als voorbeeld een innner join en jij gebruikt een (left) outer join. Outer joins zijn wel trager dan inner joins).
Netter is het wel, omdat je join clausules van je gewone where clausules afscheidt waardoor het beter leesbaar is.


Maar dit zou gewoon moeten werken hoor :
code:
1
2
3
4
5
6
7
8
9
10
select
  Software.SoftwareNaam,
  Software.Fabrikant,
  Category.Category
from
  Software
  left join Category on Category.CategoryId = Software.CategoryId
  left join Fabrikant on Fabrikant.FabrikantID = Software.FabrikantId
where
  Software.SoftwareNaam = 'MS Office 2000'
testing...........

Aaaaargh.... kvond net een discrepantie in mijn database gegevens...
De tekstfile die de database in moet, is 40KB terwijl de database zelf net 1KB is :(
Data in de database was niet volledig, dat kan mijn problemen wel eens verklaren....
Ik laat wel weer van me horen, als de database weer in orde is

leica - zeiss - fuji - apple | PSN = Sh4m1n0


  • BlaTieBla
  • Registratie: November 2000
  • Laatst online: 01-09 07:33

BlaTieBla

Vloeken En Raak Schieten

Topicstarter
$&*^&^&^%%^$$.... nu de database wel goed gevuld is, blijkt een eerdere query van mij toch wel te werken :(

Die leek wel heel erg veel op die query die sverzijl al voorstelde.

Da's zeg maar weer 1.5 dag zwoegen weggegooid :)

anyway.... Ik kan weer voorlopig vooruit.

leica - zeiss - fuji - apple | PSN = Sh4m1n0


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op maandag 22 juli 2002 21:39 schreef BlaTieBla het volgende:
Je bedoel om de fabrikant naam in de softwaretabel te zetten?
Nee, het fabrikantid is voldoende :)
Maar aangezien je weet in welke categorien de software zit, kan je ook a.d.h.v daarvan zien welke bedrijven in een categorie zitten :)
Op maandag 22 juli 2002 21:43 schreef sverzijl het volgende:
Sneller in ieder geval niet, want alleen de notatiewijze verschilt (alleen ACM gaf als voorbeeld een innner join en jij gebruikt een (left) outer join. Outer joins zijn wel trager dan inner joins).
Netter is het wel, omdat je join clausules van je gewone where clausules afscheidt waardoor het beter leesbaar is.
Neehoor, van mij is een equijoin, een inner join doe je ook ala:
select ...
from tabel
JOIN ... etc :)
Maar dan zet je er geen left/right/outer voor :)

Er zit officieel verschil in de manier waarop de resultaten samengesteld worden, maar aangezien de boel meestal maar op ongeveer 1 manier echt efficient uitgevoerd kan worden wordt de boel naar dezelfde uitvoering geoptimaliseerd.
Of iig erg vergelijkbaar :)

  • sverzijl
  • Registratie: Januari 2001
  • Laatst online: 12:53
Op maandag 22 juli 2002 23:27 schreef ACM het volgende:
Neehoor, van mij is een equijoin, een inner join doe je ook
een equijoin IS een inner join ;)

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op dinsdag 23 juli 2002 09:02 schreef sverzijl het volgende:
een equijoin IS een inner join ;)
*kuch* Owja |:(
Pagina: 1