Ich bin gerade drüber den Algorithmus, der für das zeichnen der Minimap meines Spiels verantwortlich ist, zu optimieren.
Da stehe ich jetzt vor einer Herausforderung/Problem, was ich vorher in der Art noch nie hatte.
Ich würde gern Daten einer Tabelle mit Daten der selben Tabell vergleichen.
Ich versuche das mal an einem Beispiel zu erklären:
Ich habe zB eine Tabelle Namens "map" mit den feldern "field_Id","field_X","field_Y","field_Owner".
Nun hätte ich gern alle freien Felder, welche ein Feld von einem Feld vom Besitzer 2 entfernt sind.
Die Bedingung müsste ja dann ca so aussehen:
field(1)_Owner IS NULL AND
( ABS( field(1)_X - field(2)_X ) + ABS( field(1)_Y - field(2)_Y ) ) = 1 AND
field(2)_Owner = 2
Nun mein Problem, wie verknüpfe ich die Tabelle mit sich selbst - falls das überhaupt möglich ist?
Ich habe schon probiert
SELECT [...] FROM map AS a JOIN map AS b [...]
und dann der Zugriff über zB a.field_X und b.field_Y
Das Ergebnis dabei war nen Fehler
Wäre über nen Ansatz oder Hilfestellung sehr dankbar!
P.S.: Am liebsten würde ich nen Subquery vermeiden.
Grüße n26
MySQL Query Tabelle mit sich selbst vergleichen
gepostet vor 16 Jahre, 10 Monate von n26
gepostet vor 16 Jahre, 10 Monate von TheUndeadable
Nun mein Problem, wie verknüpfe ich die Tabelle mit sich selbst - falls das überhaupt möglich ist?
SELECT a.x, b.x, a.y, b.y FROM fields AS a INNER JOIN fields AS b on a.id=b.id;
Geht ohne weiteres. Dieses Query gibt halt das kartesische Produkt aus allen Feldern heraus und ist nicht immer das schnellste...
gepostet vor 16 Jahre, 10 Monate von n26
Okay INNER JOIN habe ich noch nie verwendet... wieder schlauer. Werde ich mal testen. Da die Tabelle im Ram liegt hoffe ich, dass die Geschwindigkeit akzeptabel bleibt.
Dank dir auf jeden Fall!
Edit-----------------
Super funktioniert!
Queryzeit bei 3300 Einträgen und dem Tabellformat MEMORY ist bei ca. 0,04s (bei meinem Rechner).
Dank dir auf jeden Fall!
Edit-----------------
Super funktioniert!
Queryzeit bei 3300 Einträgen und dem Tabellformat MEMORY ist bei ca. 0,04s (bei meinem Rechner).
gepostet vor 16 Jahre, 10 Monate von Macavity
Das müsste doch gehen:
a.id as f1id, a.x as f1x, a.y as f1y, a.owner as f1owner,
b.id as f2id, b.x as f2x, b.y as f2y, b.owner as f2owner
FROM mop AS a, mop AS b
WHERE
b.owner = 2 and
a.owner = 1 and
( abs( a.x - b.x ) + abs( a.y - b.y ) ) = 1
ah zu langsam... das fiese Forensystem hat meinen Beitrag erst vernichtet und beim zweiten versuch waren die weiteren beiträge dann schon drin XD
SELECT
a.id as f1id, a.x as f1x, a.y as f1y, a.owner as f1owner,
b.id as f2id, b.x as f2x, b.y as f2y, b.owner as f2owner
FROM mop AS a, mop AS b
WHERE
b.owner = 2 and
a.owner = 1 and
( abs( a.x - b.x ) + abs( a.y - b.y ) ) = 1
ah zu langsam... das fiese Forensystem hat meinen Beitrag erst vernichtet und beim zweiten versuch waren die weiteren beiträge dann schon drin XD
gepostet vor 16 Jahre, 10 Monate von n26
Das hatte ich schon probiert - das hatte jedoch nen Fehler ausgewurfen. Der fehler hat eines der owner in der Bedingung bemängelt.
gepostet vor 16 Jahre, 10 Monate von Drezil
ist "owner" vielleicht ein geschützter begriff?
mal `owner` probiert?
mal `owner` probiert?
gepostet vor 16 Jahre, 10 Monate von Lubi
@Drezil:
Mir scheint das ein Problem mit MySQL zu sein, dass die Abfrage von Macavity nicht klappt.
Außer dem inner join fällt mir aktuell auch keine schnelle Variante ein...
Mir scheint das ein Problem mit MySQL zu sein, dass die Abfrage von Macavity nicht klappt.
Außer dem inner join fällt mir aktuell auch keine schnelle Variante ein...
gepostet vor 16 Jahre, 10 Monate von n26
Original von Drezil
ist "owner" vielleicht ein geschützter begriff?
mal `owner` probiert?
Meine Tabelle entspricht nicht dem was ich da als Bsp hin geschrieben habe
gepostet vor 16 Jahre, 10 Monate von mifritscher
Ähm, bin ich blind oder wurde der Fehler noch nie beim Namen genannt?
"gab nen Fehler" ist nicht sonderlich hilfreich und führt nur zu Ratespielchen.
was mysql aber nicht mag ist wenn während einem query gleichzeitig auf einer Tabelle gelesen und geschrieen wird, wenn es nicht ein update where ist
Vor allem Subqueries und ähnliches sind davon betroffen.
"gab nen Fehler" ist nicht sonderlich hilfreich und führt nur zu Ratespielchen.
was mysql aber nicht mag ist wenn während einem query gleichzeitig auf einer Tabelle gelesen und geschrieen wird, wenn es nicht ein update where ist
Vor allem Subqueries und ähnliches sind davon betroffen.
gepostet vor 16 Jahre, 10 Monate von Macavity
Meine Tabelle entspricht nicht dem was ich da als Bsp hin geschrieben habe
Du Honk, du. Vielleicht gibst du uns dann mal die richtige Tabelle?
Mein Beispiel hat auf eine spontan nach deinem Post erstellen Tabelle prima funktioniert, vermutlich benutzt du also wirklich irgendwelchen geschützten Namen?
gepostet vor 16 Jahre, 10 Monate von n26
Nein geb ich nicht, veröffentliche nur ungern genaue DB Strukturen
Aber Prob hat sich doch eh geklärt :>
Aber Prob hat sich doch eh geklärt :>
gepostet vor 16 Jahre, 10 Monate von progs
Aber Prob hat sich doch eh geklärt :>
Für Leute, die das gleiche Problem haben, wäre jetzt bestimmt eine Lösung interessant.
gepostet vor 16 Jahre, 10 Monate von Macavity
Nein geb ich nicht, veröffentliche nur ungern genaue DB Strukturen
Gute Güte das ist nicht dein Ernst oder?
Du erwartest Hilfe/Rat/Wasauchimmer aber bist nicht mal bereit die Struktur einer Tabelle dafür raus zu rücken nur weil du (Vermutung) Angst hast, jemand könnte deine ohne Zweifel einzigartige Struktur klauen und zu seinem eigenen Vorteil einsetzen, oder gar von deiner Erfahrung profitieren?
Tut mir ja Leid aber das ist dieses "Erzählt mir was ihr wisst aber ich verrate euch nichts von dem was ich weiß"-Verhalten. Das das vollkommen deplatziert ist sollte verständlich sein.
Mal davon abgesehen das wohl kaum einer wirklich Interesse an deiner DB Struktur und deinen Feldnamen hat. Dazu kommt das wir auch noch andere Tipps für deine Struktur haben könnten die du so sicher nicht erfahren wirst
Und jemandem dabei zu helfen ein Problem zu knacken das er nicht genau erläutert möchte ist ziemlicher Quark XD
gepostet vor 16 Jahre, 10 Monate von n26
blablabla.
Ich habe ein Bespiel genannt welche, welches dem original sehr ähnelt und auch eine Lösung wurde gepostet (inner join) also kein Grund zu flamen.
P.S. und es tut mir ja ach so leid, dass ich in der Hinsicht etwas vorsichtig bin...
blub,
n26
Ich habe ein Bespiel genannt welche, welches dem original sehr ähnelt und auch eine Lösung wurde gepostet (inner join) also kein Grund zu flamen.
P.S. und es tut mir ja ach so leid, dass ich in der Hinsicht etwas vorsichtig bin...
blub,
n26