[MySQL] Afhankelijkheden met select

Pagina: 1
Acties:

  • MikeN
  • Registratie: April 2001
  • Laatst online: 13-09 17:41
Hoi,

Ik heb een probleempje met SQL waar ik niet uitkom.

Ik ben bezig met een online game, waarin je gebouwen kan bouwen enz. enz. Maar nu moet het pas mogelijk zijn om gebouw 2 te bouwen als gebouw 1 gebouwd is. Gebouw 2 moet dus afhankelijk zijn van gebouw 1.
Nu heb ik de tabellen builds, building_types en building_deps.
In builds staan building id's, buildingtype id's en user id's.
In builds_types staan buildingtype id's en buildingnames.
In builds_deps staan 2 buildingtype id's: nr. 1 is het gebouw zelf en nr. 2 is waar hij afhankelijk van is.

Voorbeeld, stel dit is de inhoud:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
builds:
+-----+------+------+
| bid | btid | uid  |
+-----+------+------+
|   1 |    1 |    1 |
+-----+------+------+
build_types:
+------+---------+
| btid | btname  |
+------+---------+
|    1 | Gebouw1 |
|    2 | Gebouw2 |
|    3 | Gebouw3 |
+------+---------+
build_deps:
+------+---------+
| btid | on_btid |
+------+---------+
|    2 |     1 |
|    3 |     2 |
+------+---------+

Is het dan mogelijk om via 1 query te laten zien welke gebouwen user 1 kan bouwen?
Dus in dit geval alleen building 1 en 2?

Of moet ik hiervoor meerdere queries gebruiken en daarvoor een PHP functie bakken?

  • gvtulder
  • Registratie: December 2001
  • Laatst online: 27-12-2024
De query:

SELECT build_types.btid, build_types.btname
FROM build_types
LEFT JOIN build_deps ON build_deps.btid=build_types.btid
LEFT JOIN builds ON builds.btid=build_deps.on_btid AND builds.uid=1
WHERE build_deps.btid IS NULL OR builds.bid IS NOT NULL;

zou het moeten doen. Vul bij AND builds.uid=1 de uid in en je krijgt een lijstje met de gebouwen die uid 1 kan bouwen.

gvtulder.f2o.org


  • MikeN
  • Registratie: April 2001
  • Laatst online: 13-09 17:41
Hij werkt grotendeels, maar er is nog 1 probleempje:

Als gebouw 3 nu afhankelijk is van gebouw 1 EN 2, dan geeft hij gebouw 3 ook als gebouw 1 er niet is en als 1 en 2 er zijn, dan geeft hij gebouw 3 twee keer.
En dat is ongeveer het probleem waar ik ook tegenaan ben gelopen, hoe zorg ik ervoor dat MySQL ALLE deps afgaat?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12-09 21:31

Janoz

Moderator Devschuur®

!litemod

Ik heb er al een tijdje mijn hoofd over lopen breken, maar ik kwam telkens op dezelfde beperking uit als jij hierboven genoemd hebt. Ikzelf kwam niet verder dan het tellen van het aantal afhankelijkheden die nodig zijn voor een gebouw, en het aantal van die afhankelijke gebouwen die de speler heeft gebouwd, en vervolgens kijken of deze getallen even groot zijn. Dit lukt denk ik niet in 1 query, alhoewel ik wel een beetje op weg was met een query waarbij je 'gebouwid', 'aantal deps' en 'aantal benodigde deps' terugkreeg. Je zou in je query al kunnen controleren of beide aantallen gelijk waren, maar dan kun je tegen het probleem aanlopen dat een speler meerdere van eenzelfde gebouw kan hebben waardoor het aantal benodigde deps groter wordt dan ie hoort te zijn.

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


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op zondag 20 januari 2002 16:09 schreef MikeN het volgende:
En dat is ongeveer het probleem waar ik ook tegenaan ben gelopen, hoe zorg ik ervoor dat MySQL ALLE deps afgaat?
Volgens mij loop je dan tegen de grenzen van mysql aan. Vooral de beperkingen op het gebied van recursie (geen in mysql) zijn dan nogal vervelend...

  • gvtulder
  • Registratie: December 2001
  • Laatst online: 27-12-2024
Het eerste deel van het probleem lijkt me niet relevant. Als gebouw 1 er niet is, had gebouw 2 nooit gebouwd mogen worden. Dat moet je dus even controleren met php vóór je gebouw 2 laat bouwen.

Het tweede deel, van de dubbele vermelding, is eenvoudig op te lossen. Voeg aan het eind de regel:
GROUP BY build_types.btid
toe en je bent klaar.


wat kan er tijdens het typen van een reactie veel gebeuren. men was mij voor. excuses.

gvtulder.f2o.org


  • MikeN
  • Registratie: April 2001
  • Laatst online: 13-09 17:41
Op zondag 20 januari 2002 16:17 schreef ACM het volgende:

[..]

Volgens mij loop je dan tegen de grenzen van mysql aan. Vooral de beperkingen op het gebied van recursie (geen in mysql) zijn dan nogal vervelend...
Dat dacht ik al, het wordt dus toch een PHP functie.... Pff... :'(
Op zondag 20 januari 2002 16:18 schreef gvtulder het volgende:
Het eerste deel van het probleem lijkt me niet relevant. Als gebouw 1 er niet is, had gebouw 2 nooit gebouwd mogen worden. Dat moet je dus even controleren met php vóór je gebouw 2 laat bouwen.
Stel je hebt 4 gebouwen. Gebouw 2 en 3 hangen van 1 af. En gebouw 4 hangt van 2 en 3 af. Dan kun je 4 nu al krijgen voordat je 2 EN 3 hebt gebouwd.
Het tweede deel, van de dubbele vermelding, is eenvoudig op te lossen. Voeg aan het eind de regel:
GROUP BY build_types.btid
toe en je bent klaar.
Dat klopt wel ja...., nog niet aan gedacht, sorry...
Pagina: 1