![]() |
Datenbank: MySQL • Version: 5.0 • Zugriff über: -
Sichtbarkeit im Umkreis eines Objektes (Statement)
Hallo Leute,
Ich habe da kein kleines Problem... Ich möchte eine SQL-Abfrage schreiben, mit der ich aus einer Tabelle von "Einträgen" alle in Umkreis von Z Feldern herausbekomme. Die Tabelle ist etwa so aufgebaut: Table1: ----------------------------- ID | X | Y | UserID | Radius ----------------------------- 1, | 1 | 1 | 2 | 2 2, | 5 | 6 | 3 | 1 3, | 3 | 3 | 3 | 1 -> Wie vielleicht schon vermutet geht es um ein Spiel an welchem ich arbeite. Nun bin ich Spieler mit der UserID 2 Ich möchte am Ende das Objekt mit der ID 2 ausgelesen bekommen. Meine Figur befindet sich an Position 1/1 mit einer sichtweite 2 (Dargestellt durch den Radius) Somit soll sie alle Figuren finden, die sich im Radius -1/-1 bis 3/3 befinden... Wichtig dazu ist noch zu wissen, dass jeder Spieler beliebig viele Figuren besitzen kann und diese beliebig größe sichtweiten haben... Hat jemand eine Idee wie man so etwas lösen kann? |
AW: Sichtbarkeit im Umkreis eines Objektes (Statement)
Wie kommst Du auf die ID 2? Du machst es doch an den Koordinaten fest, ob das Objekt sichtbar ist, oder? Wieso ist dann 5,6 für 1,1 sichtbar bei einem Radius von 2?
|
AW: Sichtbarkeit im Umkreis eines Objektes (Statement)
Ups, du hast ja recht... :oops:
Ja, ich möchte die ID 3 angezeigt haben und die ID 2 NICHT. mein Fehler :wink: Bin wohl schon ein bisschen wirr im Kopf |
AW: Sichtbarkeit im Umkreis eines Objektes (Statement)
Nicht sonderlich elegant, aber versuch einmal
SQL-Code:
Der Parameter :id entspricht jeweils der ID der aktuellen Spielfigur.
SELECT
ID FROM Tabelle WHERE X BETWEEN ( SELECT X - Radius FROM Tabelle WHERE ID = :id) AND ( SELECT X + Radius FROM Tabelle WHERE ID = :id) AND Y BETWEEN ( SELECT Y - Radius FROM Tabelle WHERE ID = :id) AND ( SELECT Y + Radius FROM Tabelle WHERE ID = :id) AND ID <> :id [edit] Falls das so funktioniert, würde ich es an Deiner Stelle aber in eine SP verfrachten, dann kann man die Min- und Max-Werte auf einen Schlag ermitteln und in Variablen packen, mit denen man dann vergleicht. Ist bestimmt performanter als die ganzen Subselects. [/edit] |
AW: Sichtbarkeit im Umkreis eines Objektes (Statement)
joa, scheint so zu funktionieren...
Ich weiß nur nicht wie performant das ist, wenn man 100+ einheiten in der Liste hat ^^ Naja, aber irgendwo muss ich halt abspriche machen. Das mit der SP probiere ich mal aus. Vielen Dank ;) |
AW: Sichtbarkeit im Umkreis eines Objektes (Statement)
Vielleicht so:
SQL-Code:
Also bei mir funktionierts so! (Nachdem ich den Post hier ca. 10x editiert hab^^)
SELECT
tabelle.id FROM tabelle JOIN tabelle as tabelle_2 on (tabelle_2.id = :id) WHERE (tabelle.x between (tabelle_2.x-tabelle_2.radius) and (tabelle_2.x+tabelle_2.radius)) AND (tabelle.y between (tabelle_2.y-tabelle_2.radius) and (tabelle_2.y+tabelle_2.radius)) AND (tabelle.id <> tabelle_2.id) -- Sich selbst nicht finden |
AW: Sichtbarkeit im Umkreis eines Objektes (Statement)
Oder anders formuliert:
SQL-Code:
[edit] Na super, da editiert der hier rum, während ich noch tippe :tongue: [/edit]
SELECT
T2.id FROM tabelle T1 JOIN tabelle T2 ON T2.ID <> T1.ID AND T2.X BETWEEN (T1.X - T1.Radius) AND (T1.X + T1.Radius) AND T2.Y BETWEEN (T1.Y - T1.Radius) AND (T1.Y + T1.Radius) WHERE T1.ID = :id |
AW: Sichtbarkeit im Umkreis eines Objektes (Statement)
Mir raucht der Schädel :?
Naja, muss mich heute abend erstmal genauer damit befassen... Aber die Ideen sind schonmal super ;) EDIT: Okay, verstanden habe ichs mittlerweile ^^ Aber gibt es eine Möglichkeit dieses Statement so umzubauen, dass es mir ALLE sichtbaren Objekte jedes meiner Objekte zurück gibt? Oder komme ich um eine SP mit Schleife/Cursor nicht herum? EDIT2: Okay, habe die Lösung selber gefunden ^^ Anstatt
SQL-Code:
kann ich ja
"WHERE T1.ID = :id "
SQL-Code:
"WHERE T1.ID in (SELECT ID FROM T1 WHERE UserID = 2)"
|
AW: Sichtbarkeit im Umkreis eines Objektes (Statement)
Wieso nicht einfach
SQL-Code:
:?:
WHERE T1.UserID = 2
|
AW: Sichtbarkeit im Umkreis eines Objektes (Statement)
hm... :|
Ich sollte es mir nicht immer so schwer machen wenn es auch einfach geht :( Naja, vielen Dank für deine tatkräftige Unterstützung :thumb: ich dachte nicht, dass dieses Problem so "einfach" zu lösen sei |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz