MySQL-Abfrage soll "Objekte rings um ein Anderes" liefern
Pascal
- datenbank
Hi Leute!
Ich möchte gerne eine, in meinen Augen recht komplizierte Abfrage basteln. Ich habe also eine Tabelle mit 5 Spalten (in Wirklichkeit sind es 8 und dann werden üblicherweise noch weitere Informationen "geJOINt", aber belassen wir es hier mal bei 5 :-)
id | name | besitzer | position_x | position_y
Nun möchte ich also mit Angabe der Benutzer-ID alle Objekte des Besitzers und die, die sich darum befinden:
+++++ +++++
+++++ +AAA+ B = Objekt vom Benutzer
++B++ -> +ABA+ A = Objekt darum
+++++ +AAA+
+++++ +++++
Mit mehreren Abfragen geht das ja ohne Probleme, nur währe es mir lieber alles in eine zu bekommen.
Ich bin gespannt ob jemand ne Idee hat!
Grüße, Pascal
Sup!
Also ich denke, ohne sub-select sieht's einigermassen schlecht aus und für kostenlos macht Dir keine so eine Abfrage, wenn sie denn mit mySQL überhaupt geht, denn dafür muss man manchmal Stunden überlegen...
Gruesse,
Bio
Hi!
Danke, der Begriff Subselect hat mir jetzt schon weitergeholfen. Gibts einiges zum nachlesen.
Grüße, Pascal
Hallo Pascal,
Dein Problem kannst Du mit 'nested Sets' lösen. Such mal danach.
http://www.google.de/search?q=nested+sets&ie=UTF-8&oe=UTF-8&hl=de&btnG=Google-Suche
Grüße Oesi
yo,
Nun möchte ich also mit Angabe der Benutzer-ID alle Objekte des Besitzers und die, die sich darum befinden:
die objekte eines besitzers sind einfach. aber kannst du "darum befinden" genauer spezifizieren ? denke mal wenn das genauer geklärt ist, solte es nicht zu schwer sein und bezahlung nimmt hier auch keiner. eine dankeschön und ein feedback reicht meistens als lohn aus.....
Ilja
die objekte eines besitzers sind einfach. aber kannst du "darum befinden" genauer spezifizieren ? denke mal wenn das genauer geklärt ist, solte es nicht zu schwer sein und bezahlung nimmt hier auch keiner. eine dankeschön und ein feedback reicht meistens als lohn aus.....
Sorry! Ich hatte eigentlich extra darauf geachtet mein Problem ausreichend zu beschreiben. Also noch ein Versuch :-)
Die einzelnen "Objekte" werden durch die Werte in position_x und position_y in einem 2-dimensionalen Koordinatensysten positioniert, also z.B. (5/5). "Darum befinden" bedeutet jetzt also direkt an diese Position anzugrenzen:
[position_y]
^
|
|. . . . . . .
|. . . x(4/6) x(5/6) x(6/6) .
|. . . x(4/5) x(5/5) x(6/5) .
|. . . x(4/4) x(5/4) x(6/4) .
|. . . . . . .
|. . . . . . .
|. . . . . . .
+--------------------------------------------------> [position_x]
Ich hoffe so ist es jetzt verständlicher!
Grüße, Pascal
Hallo Pascal,
Warum legst Du die Objekte nicht in so in eine Tabelle?
Name,x,y
x(4/6),4,6
x(5/6),5,6
x(6/6),6,6
x(4/5),4,5
x(5/5),5,5
x(6/5),6,6
x(4/4),4,4
x(5/4),5,4
x(6/4),6,4
und fragst sie so ab?
SELECT * FROM test_objekte
WHERE x BETWEEN 4 AND 6
AND y BETWEEN 4 AND 6
Grüße Oesi
und fragst sie so ab?
SELECT * FROM test_objekte
WHERE x BETWEEN 4 AND 6
AND y BETWEEN 4 AND 6
Das Problem ist ja, dass ich vor der Abfrage noch garnicht weis zwischen welchen Werten die Objekte liegen sollen. Die bekomme ich erst mit den Koordinaten die mir "SELECT ... WHERE parent_member = $user_id" liefert.
Aber wie ja schon hier erwähnt wurde werde ich wohl mit Subselects weiterkommen, hab da schon eine Idee :-)
yo,
unterabfrage sind eine lösung, aber nicht besonders performant, da du das ergebnis ja nur einmal ermitteln musst und dann beide koordinaten hast. besser wäre es, die abfagen zu trennen und die beiden koordinaten dann in variablen zu speichern und in die zweite abfrage einzusetzen.
Ilja
zu klären wäre erst einmal, was drumherum ist. hier gibts mehrere möglichkeiten:
zum einen, was hier bereits genannt wurde, nämlich der unmittelbare nachbar auf x oder y, wobei der abstand mit 1 angenommen wude.
andererseits kann auch der nächste nachbar auf x oder y gemeint sein, welcher den kleinsten abstand hat.
man könnte aber auch einen vektor meinen, welcher einen kreis markiert, in welchem die nachbarn sein müssen.
diese bedingungen lassen sich recht einfach in dem join kriterium angeben.
der join müßte auf sich selbst, also die selbe tabelle sein.
also so ähnlich:
select t1.* from tabelle t1 inner join tabelle t2
on abs(t1.x-t2.x)=1 or abs(t1.y-t2.y)=1
where benutzer = xxx
für die nachbarn, welche 1 weg sind.