Toon posts:

[mysql] subresultaten...

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zit even met een probleempje.
Ik heb de volgende tabel:

PHP:
1
2
3
4
5
tblRegels

lngRegelID
txtSubregels
txtRegelOmschrijving


Nu kan een regel bestaan uit meerdere subregels.
Maar door mijn systeem kan ik niet bij een subregel aangeven wat de parentregel is (vraag niet waarom, het is nu eenmaal zo en daar zijn redenen voor). Dus koos ik ervoor om een veld txtSubregels te gebruiken en alleen in te vullen bij een hoofdregel.

De tabel 'tblRegels' heeft de volgende inhoud:

PHP:
1
2
3
4
5
6
7
8
9
-----------+--------------+---------------------------
lngRegelID | txtSubregels | txtRegelOmschrijving
-----------+--------------+---------------------------
1             | NULL             | subregel 1
2             | NULL             | subregel 2
3             | NULL             | subregel 3
4             | NULL             | subregel 4
5             | 1,2,3,4          | hoofdregel 1
-----------+--------------+---------------------------


Nu wil ik van een bepaalde hoofdregel alle subregels weten en dit moet in 1 query.
Dus ik dacht:

PHP:
1
2
3
4
5
6
7
8
9
10
11
$query = 
"
SELECT 
               rSubs.* 
FROM 
               tblRegels rSubs,
               tblRegels rHoofd
WHERE
               (rSubs.lngRegelID IN (rHoofd.txtSubregels))
AND
               (rHoofd.lngRegelID = 5)";


Maar dan krijg ik dus alleen subregel met lngRegelID 1 terug.
Hoe kan ik er nu voor zorgen dat ik alle 4 de subregels als resultaat krijg?!

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Helaas denk ik dat ook hier het datamodel niet helemaal optimaal is. Waarom niet txtSubregels gebruiken als een txtMainRegel? Zo kun je per subregel aangeven bij welke hoofdregel hij hoort. Een simpele join tussen die velden is dan volgens mij voldoende...

Nu moet je in een veld meerdere waardes gaan zoeken, en zoals je aangeeft gaat dat niet helemaal tof... Dat is natuurlijk ook geen optimaal stukje datamodel...

[ Voor 25% gewijzigd door OZ-Gump op 12-02-2004 12:57 ]

My personal website


  • Terranca
  • Registratie: April 2000
  • Laatst online: 27-05 18:04
Je database model klopt inderdaad niet lekker. Het kan misschien wel, maar is zeker niet effecient. Zou die "txtSubregels" kolom veranderen in een "Parent" kolom, dan is een simpel querietje zoals
code:
1
SELECT * FROM tblRegels WHERE Parent = 5

al voldoende

Verwijderd

Topicstarter
Ander datamodel is geen optie ... helaas ... heeft te maken met de wijze waarop een regel wordt opgesteld (aan de hand van contracten etc.) Eerst worden de subregels gemaakt en daarna wordt pas in een veel later stadium de hoofdregels gemaakt ...

Maar goed, ik probeer verder...

  • Terranca
  • Registratie: April 2000
  • Laatst online: 27-05 18:04
Verwijderd schreef op 12 februari 2004 @ 13:28:
Ander datamodel is geen optie ... helaas ... heeft te maken met de wijze waarop een regel wordt opgesteld (aan de hand van contracten etc.) Eerst worden de subregels gemaakt en daarna wordt pas in een veel later stadium de hoofdregels gemaakt ...

Maar goed, ik probeer verder...
Hmm, naja in dat geval zou ik even kijken naar de FIND_IN_SET(str,strlist) MySQL functie. Deze zoekt naar str in strlist ( strlist is een met komma's gescheiden lijst van strings). Zelf nog nooit gebruikt maar hoop dat t je hebt.

[edit] Functie is te vinden in de MySQL manual onder String functions btw :)

[ Voor 7% gewijzigd door Terranca op 12-02-2004 13:34 ]


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Ook een optie:
Je zou eventueel de regels kunnen voorzien van een tijdelijk (uniek) ID aan de hand waarvan je later de regels aan een kop kunt hangen door een updatequery los te laten op je tabel, waarin je het tijdelijke ID vervangt door het ID van de kopregel.

My personal website


  • Terranca
  • Registratie: April 2000
  • Laatst online: 27-05 18:04
Ook nog een optie (stom dat ik dr pas nu op kom :P): een Relatie-tabel

Dus in die tabel zet je 2 kolommen: HoofdID en SubID, PRIMARY KEY ( HoofdID, SubID )
Vervolgens kan je in de tblRegels gewoon records kwijt, en zodra je een Hoofdregel hebt, zet je deze samen met de SubID nummers als rows in de relatie-tabel (omdat primary key op combinatie van hoofd en subid zit, kan je alle combinaties erin kwijt :))

Daarna zal een join de rest van de pret bewerkstelligen
code:
1
2
3
4
5
// Niet getest ofcourse
SELECT tblRegels.*
FROM tblRelation
JOIN tblRegels ON ( tblRelation.SubID = tblRegels.id )
WHERE tblRelation.HoofdID = 5


Sim-pel, but effective :)
Pagina: 1