Pascal: MySQL-Abfrage soll "Objekte rings um ein Anderes" liefern

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

  • Position_x & -y sind die Koordinaten des "Objekts", logisch :-)
  • Besitzer ist eine Integer die, die ID des Besitzers (-> Membertable) angibt

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

  1. 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

    --
    Und er laechelt, denn er weiss: Das Boese siegt immer!
    1. Hi!

      Danke, der Begriff Subselect hat mir jetzt schon weitergeholfen. Gibts einiges zum nachlesen.

      Grüße, Pascal

      1. 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

  2. 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

    1. 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

      1. 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

        1. 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 :-)

          1. 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

  3. 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.