2010-11-23 4 views
0

Ich werde eine Analogie für diese verwenden, nur um die Erklärung zu vereinfachen.Gruppenaufgaben zusammen in Reihenfolge

Angenommen, in einem Spiel haben Sie ein Gebäude, das Bogenschützen und Kavallerie produzieren kann. Du bestellst 5 Bogenschützen, gefolgt von 3 Kavallerie und stellst eine weitere Bestellung für weitere 4 Bogenschützen auf.

Für dieses Beispiel habe ich eine MySQL-Tabelle mit:

`id` INT UNSIGNED NOT NULL AUTO_INCREMENT 
`buildingid` INT UNSIGNED NOT NULL 
`unit` ENUM('Archer','Cavalry') NOT NULL 
`complete` TIMESTAMP NOT NULL 

Jetzt möchte ich die Einheiten in der Auftragswarteschlange angezeigt werden soll. Die meisten Spiele dieses Stils zeigen einfach die 5 Bogenschützen, 3 Kavallerie und 4 andere Bogenschützen in einer Linie an. Aber da ich keine Begrenzung für die Länge der Warteschlange möchte, könnte dies für größere Aufträge (z. B. 200 Bogenschützen) sehr unordentlich sein.

Ich möchte in der Lage sein, MySQL buildingid, unit, count, next zurückzugeben, wo "zählen "ist die Anzahl der Einheiten und" next "ist der Zeitstempel der frühesten Einheit, die abgeschlossen wird.

Während ich eine GROUP BY Abfrage verwenden könnte, würde dies alle Bogenschützen zusammen gruppieren, unabhängig von der Kavallerie dazwischen. Ich würde eine Art der Gruppierung nach Einheitentyp benötigen, die auf aufeinanderfolgende Einträge beschränkt ist.

Mein vorheriger Versuch hat funktioniert, aber den Server vollständig abgestürzt, als ich die Bestellung von 1000 Einheiten getestet habe.

Ich hoffe, ich erklärte, was ich versuche klar genug zu tun ...

+0

Veröffentlichen Sie Ihre vorherige Abfrage. Sie müssen wahrscheinlich nur einige Indizes hinzufügen. –

+0

Nun, als ich es vor etwa einem Jahr ausprobiert habe, und der Code ist so schlecht, dass ich jetzt, wenn ich es ansehe, nicht verstehen kann, was ich dachte ... Aber die allgemeine Idee war: "Erhalte die Aufgabe mit der niedrigsten ID , dann bekommst du die erste Aufgabe, die nicht gleich ist ", wiederholte bis das Ende erreicht war ... Oder so. Wow, mein Code hat vor einem Jahr gesaugt o_O –

+0

Aber ja, zu der Zeit wusste ich nicht über Indizes, das ist wahrscheinlich der einzige Grund für Probleme! –

Antwort

0

Die richtige Antwort ist, sie in der Datenbank zu gruppieren, indem ein „Menge“ Feld hinzufügen. Wenn die Zeit erreicht ist, reduzieren Sie die Menge um eins und setzen Sie den Timer für die nächste Zeit zurück, oder löschen Sie die Zeile, wenn die Menge Null ist.