[mySQL] Complex...

Pagina: 1
Acties:

  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
:? M'n vorige topic is brak... Wat is dat nou weer? Goed, nog een poging (gelukkig ben ik altijd sceptisch en had ik de tekst opgeslagen - 't is nog wat :7)

Het gaat om het volgende: ik heb een relationele database en wil van verschillende tabellen informatie bij elkaar vegen in 1 query. Nu doe ik dat met 3 verschillende (op zich al betrekkelijk ingewikkelde) queries en voeg de zooi uiteindelijk bij elkaar met PHP.

Dat moet makkelijker kunnen!

Even wat uitleg.

1. Ik heb een stel personen met aanverwantte informatie. Dit staat in 1 tabel.

2. Daarnaast behoren die personen tot 1 of meer secties (hier heb ik al eerder het eea. over gevraagd). De secties staan in een tabel en de link tussen de personen en de secties staan ook in een aparte tabel.

3. Vervolgens hebben al die personen ook braaf een studie gedaan. De studies en de plaatsen waar die studies te volgen zijn staan in 2 aparte tabellen en die informatie wordt aan de personen gekoppeld in weer een andere link-tabel.

4. Al die personen werken op een bepaalde lokatie. Die lokaties staan in een aparte tabel en in de personen tabel staat er een id-link naartoe. Dit is gelukkig een 1-op-1'tje.

De tabellen zijn dus vrij simpel:

personen
--------
id
voornaam
achternaam
id_stad

personen_opleiding
------------------
id_persoon
id_studie
id_plaats

studies
-------
id
studie

studie_plaatsen
---------------
id
plaats

secties
-------
id
sectie

sectieleden
-----------
id_persoon
id_sectie

steden
------
id
plaats

Dit zijn zo'n beetje alle tabellen. Om de studies+plaatsen aan een persoon te hangen heb ik zo'n soort query:
code:
1
2
3
4
5
select id_persoon,studie,plaats from
  personen_opleiding,studies,studie_plaatsen where
  personen_opleiding.id_studie=studies.id and
  personen_opleiding.id_plaats=studie_plaatsen.id order by
  id_persoon

Om de id's van de secties (namen heb ik hier niet perse nodig) aan de personen te binden, heb ik de volgende query:
code:
1
2
select id,id_persoon from sectieleden,secties where
  sectieleden.id_sectie=secties.id order by id_persoon

En uiteindelijk wordt de rest van de persoons-informatie opgehaald met deze query:
code:
1
2
select * from personen,steden where
  steden.sid=personen.id_stad

In de loop waarmee de data van die laatste query wordt opgehaald veeg ik ook de andere info erbij en plaats het geheel in 1 array.

Nou heb ik het eea gelezen over join's, maar ik kom er niet helemaal uit. Iemand enig idee hoe dit te optimaliseren is?

[ specs ] [ Tweaker gallery ]


  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
Op dinsdag 09 oktober 2001 01:03 schreef TimMer het volgende:
Check dit ff: http://www.w3schools.com/sql/sql_join.asp
Oke, nu snap ik joins (thanks! :)) Maar hoe los ik daarmee bovenstaand probleem op? voorbeeldje? :9

[ specs ] [ Tweaker gallery ]


  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
Is hier niemand die me met bovenstaand probleem kan helpen? Is het dan zo ingewikkeld? ;( Of is 't te veel leesvoer? >:)

[ specs ] [ Tweaker gallery ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Ik begrijp je probleem niet helemaal, maar volgens mij bedoel je zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT    t1.id_persoon,
          t2.studie,
          t3.plaats,
          t5.sectie
FROM        personen_opleiding    AS t1,
          studies          AS t2,
          studie_plaatsen    AS t3,
          sectie_leden      AS t4,
          secties          AS t5
WHERE      t1.id_studie = t2.id
        AND t1.id_plaats = t3.id
        AND t4.id_persoon= t1.id_persoon
        AND t4.id_sectie = t5.id
ORDER BY    t1.id_persoon
LIMIT      0,30

zo'n verhaal kan je zo uitgebreid maken als je zelf wilt.

in het kort
code:
1
2
3
select tabelAlias.veld, ...
from   tabel as tabelAlias, ...
where  tabelAlias1.id = tabelAlias2.id AND ... # koppelingen

heb je daar wat aan?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
Op dinsdag 09 oktober 2001 14:12 schreef drm het volgende:
Ik begrijp je probleem niet helemaal, maar volgens mij bedoel je zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT    t1.id_persoon,
          t2.studie,
          t3.plaats,
          t5.sectie
FROM        personen_opleiding    AS t1,
          studies          AS t2,
          studie_plaatsen    AS t3,
          sectie_leden      AS t4,
          secties          AS t5
WHERE      t1.id_studie = t2.id
        AND t1.id_plaats = t3.id
        AND t4.id_persoon= t1.id_persoon
        AND t4.id_sectie = t5.id
ORDER BY    t1.id_persoon
LIMIT      0,30

[/code]
heb je daar wat aan?
Die query houdt geen rekening met het feit dat 1 persoon tot meerdere secties kan behoren en dat 1 persoon ook meerdere studies gedaan kan hebben. Toch? Nee, dat doet ie niet.

Ik heb boven niet m'n php code meegegeven, maar in die 3 aparte queries die ik nu doe plak ik de binnengekomen gegevens aan elkaar. Punt is dus dat bv. de sectieleden tabel er bv. zo uit ziet:

sectieleden
-----------
1 1
1 2
1 3
2 2
3 1
3 3
etc.

Dus persoon 1 is lid van secties 1, 2 en 3, persoon 2 is lid van sectie 2, etc...

Iemand anders suggereerde me eerder al om hier een 1-op-1 relatie van te maken door het als volgt aan te passen:

sectieleden
-----------
1 1,2,3
2 2
3 1,3
etc.

Dat gaat waarschijnlijk beter werken als ik heel de zaak in 1 query binnen wil halen. Of is dat niet nodig?

[ specs ] [ Tweaker gallery ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Nee dat is niet nodig.
Ik zal een klein voorbeeldje geven van een N op 1, 1 op M[/i] relatie:
Meerdere bedrijven (companies, N) kunnen van meerdere soorten (companytypes, M) zijn. Dan heb je dus een koppeltabel nodig om deze N op M relatie vas te leggen, zodat je een N op 1, en 1 op M relatie krijgt:

let niet op mijn naamgeving van velden en tabellen ;)

Companies
• companyID (primary key)
• companyName

CompanyTypes
• companyTypeID (primary key)
• companyTypeName

CompanyTypeDef
• companyID (primary key)
• companyTypeID (primary key)
samengestelde sleutel dus.

De query om alle bedrijfnamen met daarnaast hun soort weer te geven:
code:
1
2
3
4
5
6
7
SELECT    t1.companyName,
        t2.companyTypeName
FROM    Companies   AS t1,
        CompanyTypes   AS t2,
        CompanyTypeDef AS t3
WHERE     t1.companyID     = t3.companyID
    AND t2.companyTypeID = t3.companyTypeID

snappie :?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
Op dinsdag 09 oktober 2001 14:58 schreef drm het volgende:
snappie :?
Ohja, ik snap 'm. :) Ik heb ook je voorbeeld eens losgelaten op m'n DB en dat werkt op zich wel, alleen... Nu is het zo dat 1 persoon meerdere keren uit de query rolt, bv voor elke andere sectie waar hij/zij lid van is. Dit is natuurlijk op zich wel logisch, maar niet de bedoeling. Elke persoon moet maar 1x uit die query rollen met daarbij een lijstje van de secties en studies. Is dat mogelijk met bv. een concat ofzo? Kan je met een concat een vorige row bij de huidge row optellen - van 1 bepaald veld dan. Dus in dit geval alle secties bij elkaar plakken.

Volgens mij gaat dat niet werken...

Op zich kom ik al een heel eind met deze query. Met PHP kan ik verder die dubbele persoon-id's wel afhandelen, zodat PHP de secties aan elkaar plakt.

[ specs ] [ Tweaker gallery ]


  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 08-09 20:35

CyberSnooP

^^^^ schrijft --->

Wat jij wilt is enigszins vreemd.

Je wilt in een query-result verschillende soorten gegevens. Een query geeft een tabel terug, met een vast aantal kolommen (velden, attributen whatever). Je kunt dus niet verwachten dat de eerste rij de persoonsgegevens bevat, en de 10 volgende rijen de studigegevens.

Ik zou het dus laten zoals het was :)

P.S. Tabel-alias verhogen de leesbaarheid.

|_____vakje______|


  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
Nee, ik wil het niet op die manier. Eigenlijk wil ik zo'n soort tabel terug krijgen uit de query:

id_persoon; studie+plaats; secties
1; TN Uni Eindhoven, IT Uni Eindhoven; 1, 2, 3
2; Bla Uni A'dam; 1, 2
3; etc...

Dus: persoon nr. 1 heeft TN gedaan aan de Uni in Eindhoven en ook IT aan de Uni in Eindhoven en behoort tot secties 1, 2 en 3. Persoon nr. 2 ... bla! Dus op 1 regel alle resultaten bij elkaar. Nu is dat verdeeld over meerdere regels en moet er nog steeds worden gepuzzeld met PHP om de resultaten bij elkaar te vegen. Als bv. een persoon lid is van 3 secties, maar slechts 1 studie heeft gedaan krijg je zoiets terug:

1; studie1; 1
1; studie1; 2
1; studie1; 3

Dus moet er met PHP worden gekeken of:

1. het id dezelfde is als de vorige,
2. ja: kijk of studie hetzelfde is als vorige
3. ja: skip, nee: voeg toe
4. sectie zelfde als vorige, etc...

Geen probleem, maar kan de DB-engine die dingen al niet bij elkaar vegen?

[ specs ] [ Tweaker gallery ]


  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 08-09 20:35

CyberSnooP

^^^^ schrijft --->

Nog steeds moeilijk.. Je wilt dus meerdere rijen (van de tabel persoon_sectie) combineren tot één veld in je uiteindelijke tabel. Voor zover ik weet gaat dat met JOINS niet lukken.

De reeds genoemde oplossing van drm komt het dichtste bij je wens.

|_____vakje______|


  • Explore
  • Registratie: Maart 2001
  • Laatst online: 08-04-2011

Explore

Op zoek naar werk

Topicstarter
Precies, dat dacht ik al. Met PHP kan ik de zaak wel aan elkaar plakken. Ik heb de query van DRM al getest op m'n DB en die werkt vrij goed. Beetje tweaken nog, maar dat komt wel goed.

Bedankt allemaal! :)

[ specs ] [ Tweaker gallery ]

Pagina: 1