[MySQL] Sorteren over verschillende tabellen.

Pagina: 1
Acties:

  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
Een vraag over MySQL met betrekking tot één query op 3 tabellen. Ik vraag me af of wat ik in dit geval wil überhaupt wel mogelijk is met MySQL. Het zou mijn systeem een stuk efficiënter maken.

Het gaat om 3 verschillende tabellen. Eén hoofdtabel met algemene informatie over objecten die gebruikt worden in een CMS omgeving. De twee "sub"-tabellen vullen elk op hun eigen manier het "Hoofd"-object aan met specifieke informatie. Een versimpelde weergave van de tabellen zou er ongeveer zo uit kunnen zien:

De hoofdtabel
code:
1
2
3
4
objectID INT(11)  PRIMARY KEY
caption VARCHAR(100)
created_by INT(11)
live_version INT(11)


Eerste subtabel (pagina)
code:
1
2
3
4
5
6
objectID INT(11)    PRIMARY KEY
version INT(11)    PRIMARY KEY
titel VARCHAR(100)
content TEXT
menuID INT(11)
menuorder INT(11)


Tweede subtabel (ander item)
code:
1
2
3
4
5
objectID INT(11)     PRIMARY KEY
version INT(11)      PRIMARY KEY
content TEXT
menuID INT(11)
menuorder INT(11)


Wat ik nu graag wil, is met één query alle items uit de database tabellen halen, die in een specifiek menu (menuID) staan. Voor de volledigheid, zowel de pagina's als de andere items kunnen in hetzelfde menu staan. De 'menuorder' geeft in dit geval aan op welke positie een item in het menu moet komen te staan. Ik wil graag alle objecten gesorteerd uit de database halen, zodat ik dit niet later nog eens in PHP hoef te doen.

De query waartoe ik op dit moment ben gekomen, ziet er ongeveer zo uit:

code:
1
2
3
4
SELECT  DISTINCT ( objectID )
FROM objects O, pages A, items B
WHERE ( ( A.menuID =6 AND A.objectID = O.objectID ) OR ( B.menuID =6 AND B.objectID = O.objectID ) )
ORDER  BY A.menuorder, B.menuorder


Zoals duidelijk zal zijn geeft dit niet het gewenste resultaat, omdat nu eerst op de menuorder kolom in tabel A wordt gesorteerd en daarna op de menuorder kolom in tabel B. De twee menuorder kolommen moet nu juist gecombineerd worden.

Wie is er zo los op MySQL, dat hij/zij kan vertellen of wat ik wil ook daadwerkelijk mogelijk is. Helaas draaien de LIVE servers waarmee ik moet werken (nog) niet met een MySQL versie waarmee sub-queries mogelijk zijn ... dat is dus geen optie.

Mijn dank is groot voor alle hulp

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Je databasestructuur is nogal vreemd. Je twee subtabellen zijn, met uitzondering van één veldje, identiek. Waarom maak je er dan niet gewoon één tabel van, waarbij dat ene veld de waarde NULL kan hebben? Je kan eventueel via een ander extra veld opgeven wat voor soort object het betreft, maar eigenlijk lijkt me dat niet zo nodig: als het titelveld NULL is, dan is het een ander item, en anders een pagina. :)

Wanneer je die verandering in je databasestructuur door zou voeren, heb je ook meteen dit probleem niet meer. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
Zoals ik al meld in m'n vraag, gaat het hier om een versimpelde weergave van de werkelijkheid. In de database waar het om gaat zijn er wel degelijk meer verschillen tussen de twee subtabellen. Bovendien zijn dit niet de enige subtabellen in de database ... er zijn er nog een hoop meer, die ook allemaal op essentiële delen van elkaar verschillen.

... was het leven maar zo makkelijk ;)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

gvanh schreef op woensdag 26 januari 2005 @ 13:18:
Zoals ik al meld in m'n vraag, gaat het hier om een versimpelde weergave van de werkelijkheid. In de database waar het om gaat zijn er wel degelijk meer verschillen tussen de twee subtabellen. Bovendien zijn dit niet de enige subtabellen in de database ... er zijn er nog een hoop meer, die ook allemaal op essentiële delen van elkaar verschillen.

... was het leven maar zo makkelijk ;)
Dan nog zou je volgens normalisatieregels de algemene delen die alle tabellen gemeen hebben in één tabel moeten stoppen, en daarna met referentiële sleutels verbindingen leggen met tabellen die alle data bevatten die uniek is voor elke tabel.

In jouw geval:
Tabel object
code:
1
2
3
4
5
objectID INT(11)    PRIMARY KEY
version INT(11)    PRIMARY KEY
content TEXT
menuID INT(11)
menuorder INT(11)


Tabel pagina
code:
1
2
objectID INT(11)    PRIMARY KEY
titel VARCHAR(100)

Dat kan natuurlijk voor alle tabellen en meerdere velden.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Is er geen mogelijkheid om de data gewoon op te halen, en ze in de toepassing te sorteren? Dit is niet zo netjes, maar misschien een goede noodoplossing...

Ik heb zelf ook voor dit vraagstuk gestaan, en als ik even terugkijk naar de oude code, zie ik dat ik ze toch ook in PHP heb zitten sorteren... Die code is nu totaal veranderd mbv subqueries... Het is sowieso geen slecht idee om te informeren naar een upgrade van de MySQL

[ Voor 94% gewijzigd door Verwijderd op 26-01-2005 13:54 ]


  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
Ja, dat heb ik nou juist gedaan (het volgen van de normalisatie regels), dat is de hele reden dat er "sub"-tabellen zijn. Er zijn namelijk andere subtabellen (hier niet genoemd) die geen van de velden bevatten, die in genoemde sub-tabellen voorkomen.

Normalisatie is de hele reden dat ik überhaupt met deze queries bezig ben. :*)
Verwijderd schreef op woensdag 26 januari 2005 @ 13:45:
Is er geen mogelijkheid om de data gewoon op te halen, en ze in de toepassing te sorteren? Dit is niet zo netjes, maar misschien een goede noodoplossing...
Dat is inderdaad de oplossing die ik nu aan het implementeren ben "as-we-speak". Dat is nu voor het grootste deel gelukt. Eerst per module de objecten uit de database gehaald, daarna gesorteerd met PHP's usort functie. Dat lijkt wel goed te werken. Helaas is het niet de optimale oplossing.

[ Voor 47% gewijzigd door gvanh op 26-01-2005 13:48 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15-05 08:48

Janoz

Moderator Devschuur®

!litemod

Waneer je de x resultaten elk appart gesorteerd in een array heb zitten kun je deze vervolgens heel simpel samenvoegen door alleen het laatste stukje van de merge sort te gebruiken. Deze methode is waarschijnlijk een stuk efficienter dan met usort gaan werken.

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


  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
Janoz schreef op woensdag 26 januari 2005 @ 14:00:
Waneer je de x resultaten elk appart gesorteerd in een array heb zitten kun je deze vervolgens heel simpel samenvoegen door alleen het laatste stukje van de merge sort te gebruiken. Deze methode is waarschijnlijk een stuk efficienter dan met usort gaan werken.
Dank voor de suggestie. Ik ben weer even het lijstje met array-functies van PHP doorgelopen, maar ik kan niet de functie vinden waar jij op doelt. Welke moet ik hebben?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 15-05 08:48

Janoz

Moderator Devschuur®

!litemod

Niet alles bestaat uit voorgedefinieerde php functies. Het merge-sort algoritme is gewoon een algoritme. Op google is vast wel wat te vinden hoe het algoritme gaat.

[ Voor 8% gewijzigd door Janoz op 26-01-2005 14:13 ]

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


  • gvanh
  • Registratie: April 2003
  • Laatst online: 02-12-2023

gvanh

Webdeveloper

Topicstarter
Ah, op zo'n manier. Ok, dank je wel ... ik zal er even naar zoeken!
Pagina: 1