[gelöst] Alias aus SELECT wieder in SELECT verwendet

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [gelöst] Alias aus SELECT wieder in SELECT verwendet

    Komischer Titel ich weiß

    Was will ich?

    Ich habe eine Abfrage, in etwa so:

    SELECT maennlich, weiblich, maenlich+weiblich AS 'Gesamt'
    FROM tbl

    Ich möchte nun das 'Gesamt' im SELECT weiterverwenden:

    SELECT maennlich, weiblich, maenlich+weiblich AS 'Gesamt', (preis/Gesamt)*maennlich
    FROM tbl

    Fehler: Gesamt nicht bekannt

    Gibt es eine Möglichkeit anders Alias-Namen zu vergeben? Eine Möglichkeit wäre ein Sub-Select, aber das müsste ich ja dann x-Mal machen

    Danke!

  • #2
    Also ich glaube die Aliase sind in einer Select Abfrage generell nicht bekannt.

    Man könnte dies so lösen:

    SELECT *, (preis/Gesamt)*maennlich FROM (SELECT maennlich, weiblich, maenlich+weiblich AS 'Gesamt' FROM tbl) as foo


    Ob das hilft?
    Download ET-Chat v3.x.x

    Kommentar


    • #3
      Hallo,

      Code:
      SELECT maennlich, weiblich, @gesamt:=maennlich+weiblich AS `Gesamt`, (preis/@gesamt)*maennlich
      FROM tbl
      Gruß,

      Amica
      Zuletzt geändert von AmicaNoctis; 18.09.2009, 13:05.
      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
      Super, danke!
      [/COLOR]

      Kommentar


      • #4
        Zitat von AmicaNoctis Beitrag anzeigen
        Code:
        SELECT maennlich, weiblich, @gesamt:=maennlich+weiblich AS `Gesamt`, (preis/@gesamt)*maennlich
        FROM tbl
        Diese Lösung ist nicht zu empfehlen, siehe:
        Zitat von http://dev.mysql.com/doc/refman/5.0/en/user-variables.html
        The order of evaluation for user variables is undefined and may change based on the elements contained within a given query. In SELECT @a, @a := @a+1 ..., you might think that MySQL will evaluate @a first and then do an assignment second, but changing the query (for example, by adding a GROUP BY, HAVING, or ORDER BY clause) may change the order of evaluation.

        The general rule is never to assign a value to a user variable in one part of a statement and use the same variable in some other part of the same statement. You might get the results you expect, but this is not guaranteed.

        Möglich ist nebst Subselect auch etwas wie folgt:
        Code:
        SELECT *, (preis/Gesamt)*maennlich FROM (SELECT maennlich, weiblich, maenlich+weiblich AS 'Gesamt' FROM tbl) a

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          @ghostgambler: , das wusste ich (noch) nicht.
          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
          Super, danke!
          [/COLOR]

          Kommentar


          • #6
            Theoretisch ist es möglich ... das DBS kann bei der Analyse der Query merken, dass Gesamt ein Alias ist, welches woanders in der Query definiert wird und einen Execution Plan erzeugen, der Gesamt einfach früh genug bereitstellt. Aber das würde u.U. dazu führen, dass die üblichen Optimierungen nicht mehr angewendet werden können.

            Um die Bereitstellung der Aliase von der Optimierung zu entkoppeln, kann man soetwas wie ein two pass compile machen. Zunächst erzeugt man eine temporary table, in der die Aliase als echte Attribute/Spalten materialisiert werden. Auf dieser Tabelle kann dann die eigentliche Query ausgeführt werden.

            Aber aus mindestens zwei Gründen ist das oft keine Lösung:
            1. Wenn Alias-Attribute zur Berechnung weiterer Alias-Attribute verwendet werden sollen, braucht man eine weitere temporary table, sozusagen einen third pass. Oder einen vierten oder fünften ...
            2. Fürs Erzeugen einer temporary table und deren Abfrage sind zwei ganz andere Queries nötig und somit wird ganz anders optimiert und ausgeführt. Außerdem muss gelockt werden. Die Performance wird also keinesfalls besser.

            Insbesondere der zweite Grund ist ein Killer-Argument. Also wie gesagt, theoretisch möglich, macht man aber nicht.

            Statt Aliase zu referenzieren, schreib einfach aus, was dahinter steckt.

            SELECT maennlich, weiblich, maenlich+weiblich AS 'Gesamt', (preis/(maenlich+weiblich))*maennlich
            FROM tbl

            Mit einer guten Abstraktionsschicht in der Applikation muss das noch nicht mal im Code stehen. Folgendes wäre denkbar:

            PHP-Code:
            $q = new Query('tbl');
            $q->addFields('maennlich''weiblich');
            $q->addAlias('Gesamt''maennlich+weiblich');
            $q->addField('(preis/'$q->getAlias('Gesamt') .')*maennlich'); 

            Kommentar


            • #7
              Wegen solch Kleinkram sollte man einfach

              SELECT maennlich, weiblich,(preis/(maennlich + weiblich))*maennlich as anteil
              FROM tbl

              machen und gut ist.

              Kommentar

              Lädt...
              X