Transactions in juiste volgorde
Op elke pagina wordt de transactie aangeroepen die vervolgens al deze acties over de hele wereld berekend.
Nu heb ik al deze acties in een aparte database opgeslagen. Dus de trainingen in een tabel 'training', de legers in een tabel 'moving_armies', etcetera.
Nu is mijn vraag: hoe roep ik deze in de juiste volgorde aan? Nu heb ik bijvoorbeeld dat eerst de training transactie wordt opgeroepen, dan de bouw transactie en vervolgens de legers transactie. Maar indien een training om 14:32 is afgelopen, en een oorlog om 14:31, dan wordt alsnog die training eerst gedaan indien het script om 14:35 wordt aangeroepen ofzo.
Hoe voorkom ik dit? Moet ik dan SQL queries maken, en dan iets in een array opslaan ofzo? Hopelijk heb ik het duidelijk gezegd, anders hoor ik het wel.
En bedoel je met transactions de transactions in mysql?
Gewijzigd op 12/06/2011 14:40:01 door Arjan -
Ik heb bijvoorbeeld 3 tabellen:
- training
- development
- moving_armies
Ze hebben allemaal een waarde 'Eindtijd', die inhoudt wanneer de actie is afgelopen. Dus in het geval van een training geeft deze aan wanneer de training is afgelopen, en bij moving_armies geeft het aan wanneer deze aanval is aangekomen.
Nu heb ik op elke pagina Transactions staan (in MySQL dus) die ophalen of er iets ergens op de wereld is voltooid, bijvoorbeeld een training of ontwikkeling. Stel dat een speler-X om 17:38 inlogt en hij is de eerste sinds 5 minuten die op de server komt kijken (dus hij voert als het ware Transactions uit van acties die in de laatste 5 minuten zijn voltooid). Er blijkt van een andere speler-Y een training om 17:35:40 afgelopen te zijn er komt een aanval bij hem binnen om 17:36:50. Deze worden dus door de speler-X voltooid. Nu worden in het bestand actions.php (waar alle transactions staan) eerst die van een training aangeroepen en dan van een ontwikkeling en dan van een oorlog. Dus eerst wordt de training voltooid en dan de binnenkomende aanval terwijl dit eigenlijk omgekeerd moet zijn: de aanval kwam immers eerder binnen dan de training afgelopen was.
Nu moet ik dus een SQL query maken die van alle 3 de databases de waarden ophaalt en vervolgens op de eindtijd ordert. Dus zoiets als:
Code (php)
1
2
3
2
3
<?php
$query="SELECT Training_waarde1, Training_waarde2 FROM training, SELECT Ontwikkeling_waarde1 FROM development, SELECT Leger_waarde1, Leger_waarde2, Leger_waarde3, etc FROM moving_armies WHERE Eindtijd<NOW() ORDER BY Eindtijd FOR UPDATE";
?>
$query="SELECT Training_waarde1, Training_waarde2 FROM training, SELECT Ontwikkeling_waarde1 FROM development, SELECT Leger_waarde1, Leger_waarde2, Leger_waarde3, etc FROM moving_armies WHERE Eindtijd<NOW() ORDER BY Eindtijd FOR UPDATE";
?>
(Ja, ik weet dat er niks van klopt, maar het is om het te verduidelijken)
Alleen hoe doe ik dat? Als het nog steeds onduidelijk is hoor ik het wel:-)
Gewijzigd op 12/06/2011 20:09:54 door Jordy nvt
Even uit de losse pols:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
(
SELECT
Training_waarde1 AS waarde1,
Training_waarde2 AS waarde2,
Eindtijd
FROM
training
WHERE
Eindtijd < NOW()
)
UNION
(
SELECT
Ontwikkeling_waarde1 AS waarde1,
Ontwikkeling_waarde2 AS waarde2,
Eindtijd
FROM
development
WHERE
Eindtijd < NOW()
)
UNION
(
SELECT
Leger_waarde1 AS waarde1,
Leger_waarde2 AS waarde2,
Eindtijd
FROM
moving_armies
WHERE
Eindtijd < NOW()
)
ORDER BY
Eindtijd ASC
SELECT
Training_waarde1 AS waarde1,
Training_waarde2 AS waarde2,
Eindtijd
FROM
training
WHERE
Eindtijd < NOW()
)
UNION
(
SELECT
Ontwikkeling_waarde1 AS waarde1,
Ontwikkeling_waarde2 AS waarde2,
Eindtijd
FROM
development
WHERE
Eindtijd < NOW()
)
UNION
(
SELECT
Leger_waarde1 AS waarde1,
Leger_waarde2 AS waarde2,
Eindtijd
FROM
moving_armies
WHERE
Eindtijd < NOW()
)
ORDER BY
Eindtijd ASC
Let er op dat de waarden binnen de SELECT in alle subqueries gelijk moeten zijn.
Gewijzigd op 12/06/2011 20:29:49 door Arjan -
Ik ga hier overmorgen (dan heb ik pas tijd:-( )meteen mee aan de slag, bedankt in ieder geval!!!
Zoiets:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
(
SELECT
'training' AS type,
Training_waarde1 AS waarde1,
Training_waarde2 AS waarde2,
Eindtijd
FROM
training
WHERE
Eindtijd < NOW()
)
UNION
(
SELECT
'ontwikkeling' AS type,
Ontwikkeling_waarde1 AS waarde1,
Ontwikkeling_waarde2 AS waarde2,
Eindtijd
FROM
development
WHERE
Eindtijd < NOW()
)
UNION
(
SELECT
'leger' AS type,
Leger_waarde1 AS waarde1,
Leger_waarde2 AS waarde2,
Eindtijd
FROM
moving_armies
WHERE
Eindtijd < NOW()
)
ORDER BY
Eindtijd ASC
SELECT
'training' AS type,
Training_waarde1 AS waarde1,
Training_waarde2 AS waarde2,
Eindtijd
FROM
training
WHERE
Eindtijd < NOW()
)
UNION
(
SELECT
'ontwikkeling' AS type,
Ontwikkeling_waarde1 AS waarde1,
Ontwikkeling_waarde2 AS waarde2,
Eindtijd
FROM
development
WHERE
Eindtijd < NOW()
)
UNION
(
SELECT
'leger' AS type,
Leger_waarde1 AS waarde1,
Leger_waarde2 AS waarde2,
Eindtijd
FROM
moving_armies
WHERE
Eindtijd < NOW()
)
ORDER BY
Eindtijd ASC
Hoe kan ik dat dan oplossen?
Gewijzigd op 16/06/2011 16:34:31 door Jordy nvt
Waarschijnlijk moet ik dus met Joins gaan werken, alleen dat snap ik niet helemaal. Op internet heb ik al gezocht, maar hoe zou het er dan in mijn geval uit gaan zien ivm mijn vorige vraag?
Ok, allerlaatste bump... allerlaatste poging...