Knud Schröder: (MySQL) Abfrage sortieren, nur wie?

Hallo Forummer!

Dank Eurer Hilfe bin ich schon recht weit in PHP und MySQL vorgedrungen und ich hoffe, dass meine
Fragen immer seltener werden bzw. dass ich dieses Wissen ebenso weitergeben kann, wie ihr.

Die folgende Abfragefunktioniert schonmal hervorragend, aber jetzt möchte ich die Ergebnisliste
sortiert haben. Aber wie sortiert man ein nicht existierendes Feld?

$abfrage = "select kunden.*,plz.X,plz.Y from kunden, plz where kunden.plz = plz.plz AND sqrt(pow(('$x1'-plz.X)*80,2)+pow(('$y1'-plz.Y)*110,2)) <= '$radius' limit 0,$limit";

Sortiert werden soll nach dem Ergebnis des Wurzelausdrucks.

Noch ne Frage am Rande:
Kann ich eigentlich überprüfen, ob innerhalb der Frage der Index auch genutzt wird?
Ich hab die Tabelle plz nach dem Feld plz als Primärschlüssel und so indiziert.

CREATE TABLE plz (
   PLZ char(5) NOT NULL,
   X double(7,4) DEFAULT '0.0000' NOT NULL,
   Y double(7,4) DEFAULT '0.0000' NOT NULL,
   PRIMARY KEY (PLZ),
   KEY PLZ (PLZ)
);

Hab ich das so richtig gemacht?

Danke für Eure Hilfe !

Knud

  1. Hallo

    $abfrage = "select kunden.*,plz.X,plz.Y from kunden, plz where kunden.plz = plz.plz AND sqrt(pow(('$x1'-plz.X)*80,2)+pow(('$y1'-plz.Y)*110,2)) <= '$radius' limit 0,$limit";

    vesuch es mal so:
    $abfrage = "select kunden.*,plz.X,plz.Y from kunden, plz where kunden.plz = plz.plz AND (sqrt(pow(('$x1'-plz.X)*80,2)+pow(('$y1'-plz.Y)*110,2)) <= '$radius') as feld order by feld ASC, limit 0,$limit";

    mit dem AS parameter sollte es eigentlich gehen.. nur wie du ihn genau notieren mußt weiß ich jetzt nicht auswendig

    Disclaimer: UNTESTED

    1. Hi Ludwig !

      $abfrage = "select kunden.*,plz.X,plz.Y from kunden, plz where kunden.plz = plz.plz AND (sqrt(pow(('$x1'-plz.X)*80,2)+pow(('$y1'-plz.Y)*110,2)) <= '$radius') as feld order by feld ASC, limit 0,$limit";

      Hat schonmal nicht funktioniert :-(

      Hab auch das AS mal vor die Abfrage '<=$radius' gestellt --> ohne Erfolg!
      Schau mir jetzt nochmal intensivst die Geschichte mit dem 'AS' an,

      Danke trotzdem, vielleicht fällt ja Dir oder den anderen noch was ein, wäre toll !
      Werd die Lösung (sollte ich tatsächlich doch selber drauf kommen) hier kund tun.

      So long,

      Knud

      1. Hallo Knud,

        $abfrage = "select kunden.*,plz.X,plz.Y from kunden, plz where kunden.plz = plz.plz AND (sqrt(pow(('$x1'-plz.X)*80,2)+pow(('$y1'-plz.Y)*110,2)) <= '$radius') as feld order by feld ASC, limit 0,$limit";

        brauchst Du einen Alias für den Ausdruck, musst Du ihn auch selektieren, also

        $abfrage = "select kunden.*,plz.X,plz.Y, (sqrt(pow(('$x1'-plz.X)*80,2)+pow(('$y1'-plz.Y)*110,2))) as feld from kunden, plz where kunden.plz = plz.plz AND feld <= '$radius' order by feld ASC, limit 0,$limit";

        Habe ich jetzt zwar nicht ausprobiert, muss aber funjtionieren.

        Gruß
          Micha

        1. Hallo Micha,

          folgende Abfrage hab ich nun gebastelt:

          $abfrage = "select kunden.*,plz.X,plz.Y,
                                sqrt(pow(('$x1'-plz.X)*80,2)+pow(('$y1'-plz.Y)*110,2)) AS entfernung
                                from kunden, plz
                                where kunden.plz = plz.plz AND
                                entfernung <= '$radius' order by entfernung limit 0,$limit";

          Hatte ich gestern auch schon probiert (allerdings mit Schreibfehler), aber das funktioniert leider auch nicht!

          Hatte irgendwie die Hoffnung, dass das ganze etwas einfacher wäre...aber naja, umso größer die Freude, wenn gelöst.

          Die Hoffnung noch nicht aufgebend...

          Knud

  2. Hallo Forummer !

    Ich hab die Lösung !

    Die korrekte Abfrage lautet:
    $abfrage = "select kunden.*,plz.X,plz.Y, sqrt(pow(('$x1'-plz.X)*80,2)+pow(('$y1'-plz.Y)*110,2)) AS feld from kunden, plz where kunden.plz = plz.plz AND sqrt(pow(('$x1'-plz.X)*80,2)+pow(('$y1'-plz.Y)*110,2)) <= '$radius' order by feld limit 0,$limit";

    Danke an alle, die mir geholfen haben !!!!

    Die Frage mit der Index-Kontrolle steht allerdings immer noch. Wäre schön, wenn sich einer finden würde, der sich da auskennt.

    Und eine weitere Frage hab ich auch noch:
    Ich wollte wie im folgenden Befehl noch eine direkte Zuweisung implementieren, das geht doch oder? Aber wie?

    if ($anz = mysql_num_rows($erg) > 0) {
          echo "$anz Sätze gefunden.\n";
    }

    Gruß an alle fleißigen,

    Knud

    1. Hallo Knud,

      Die Frage mit der Index-Kontrolle steht allerdings immer noch. Wäre schön, wenn sich einer finden würde, der sich da auskennt.

      im Prinzip reicht EXPLAIN <dein SELECT-Statement>;. In der Spalte "key" steht der benutzte Schlüssel, steht in der Spalte "type" ALL, wird die Tabelle für jede Kombination voll gescannt. Siehe dazu bitte das Manual Punkt 7.22 (Explain). Habe das mal ausprobiert (mit Index auf kunden.plz), diesen verwendete er aber nicht. Für deine Abfrage bringt der PK auf plz.plz übrigens sowieso nichts, höchstens der kunden.plz.

      Gruß
        Micha