simmel: mysql, Abfrage, wenn var grösser 0, dann wert aus anderer Table

ich möchte aus zwei Tabellen etwas auslesen.

SELECT a.name, b,ort a.art FROM TABLE

jetzt wird kompliziert, jedenfalls für mich.

in der Varibal a.art ist meist eine 0, wenn aber eine andere Zahl drin ist, soll in einer zweiten Tabelle der Wert dafür geholt werden, sonst soll eben die 0 drin bleiben.

Wie kann ich so etwas machen

Simmel

  1. Moin

    SELECT a.name, b,ort a.art FROM TABLE

    jetzt wird kompliziert, jedenfalls für mich.

    in der Varibal a.art ist meist eine 0, wenn aber eine andere Zahl drin ist, soll in einer zweiten Tabelle der Wert dafür geholt werden, sonst soll eben die 0 drin bleiben.

    So kompliziert ist das gar nicht. MySQL kenn IF ELSE Anweisungen (sogar in verkürzter Form als IF-Funktion http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if)

    ungefähr so:

      
    SELECT a.name, b.ort, IF( a.art <> 0, a.art, (SELECT .......) ) AS art FROM a, b  
    
    

    Gruß Bobby

    --
    -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
    ### Henry L. Mencken ###
    -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
    ### Viktor Frankl ###
    ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
    1. SELECT a.name, b.ort, IF( a.art <> 0, (SELECT .......), a.art ) AS art FROM a, b

      Genau das ist es, ich hab nur die beiden letzten beiden Werte vertauscht. Doch wie bekomme ich zwei Werte aus der zweiten Select Abfrage heraus? wert1 ,wert2, weil in das AS art geht nur eins rein, raus

      SELECT a.name, b.ort, IF( a.art <> 0, (SELECT wert1,wert2 .....), a.art ) AS art FROM a, b

      1. Hello,

        SELECT a.name, b.ort, IF( a.art <> 0, (SELECT .......), a.art ) AS art FROM a, b

        Genau das ist es, ich hab nur die beiden letzten beiden Werte vertauscht. Doch wie bekomme ich zwei Werte aus der zweiten Select Abfrage heraus? wert1 ,wert2, weil in das AS art geht nur eins rein, raus

        SELECT a.name, b.ort, IF( a.art <> 0, (SELECT wert1,wert2 .....), a.art ) AS art FROM a, b

        Indem Du das mit dem Subselect lässt und stattdessen Joins oder implicit Joins benutzt.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bikers-lodge.com
        1. Moin

          SELECT a.name, b.ort, IF( a.art <> 0, (SELECT .......), a.art ) AS art FROM a, b

          Genau das ist es, ich hab nur die beiden letzten beiden Werte vertauscht. Doch wie bekomme ich zwei Werte aus der zweiten Select Abfrage heraus? wert1 ,wert2, weil in das AS art geht nur eins rein, raus

          SELECT a.name, b.ort, IF( a.art <> 0, (SELECT wert1,wert2 .....), a.art ) AS art FROM a, b

          Indem Du das mit dem Subselect lässt und stattdessen Joins oder implicit Joins benutzt.

          OK... wenn es mehr als ein Wert ist, dann natürlich mit JOINs arbeiten. Ich hatte es so verstanden, dass wenn ein Wert 0 ist dass dann _EIN_ anderer dies ersetzen soll. Da wärs mit dem Subselect die optimale Lösung gewesen.

          Wenn es mehr Werte sein sollen dann auf alle Fälle mit JOINS

          Tom, ich hatte es wirklich schon mal, dass subselects (wenn nur ein Wert rausgesucht werden soll) schneller sind als JOIN. Ich habe allerdings bis heute (aus Zeitgründen) noch nicht herausgefunden, warum das so ist. Ich vermute dies lag an der InnoDB-Engine. Es war alles ordentlich indiziert und mit den entsprechenden Fremdschlüsselbeziehungen versehen. Auch die Datenbankkonfiguration war auf große Datenmengen ausgerichtet.

          Gruß Bobby

          --
          -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
          ### Henry L. Mencken ###
          -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
          ### Viktor Frankl ###
          ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
          1. Tach!

            Tom, ich hatte es wirklich schon mal, dass subselects (wenn nur ein Wert rausgesucht werden soll) schneller sind als JOIN. Ich habe allerdings bis heute (aus Zeitgründen) noch nicht herausgefunden, warum das so ist.

            Was der Optimizer unter der Haube tun kann und das noch in Abhängigkeit der anfallenden Datenmenge, spielt auch noch eine große Rolle, so dass man keine pauschalen Aussagen treffen kann, was nun schneller ist. Aber mal so prinzipiell gesehen muss bei einem Join zuerst die große Datenmenge erzeugt werden, dann kommt die Filterung der Where-Klausel dran. Wenn die bereits gefilterten Daten der einen Tabelle eine geringe Menge ergeben, sind dann wenige Subselects - noch dazu wenn sie über einen Index agehandelt werden können - schneller zu ermitteln. Aber wie gesagt, das kann je nach Datenmenge auch sorum und sorum enden.

            dedlfix.

            1. Hello dedlfix,

              @Tom, ich hatte es wirklich schon mal, dass subselects (wenn nur ein Wert rausgesucht werden soll) schneller sind als JOIN. Ich habe allerdings bis heute (aus Zeitgründen) noch nicht herausgefunden, warum das so ist.

              Was der Optimizer unter der Haube tun kann und das noch in Abhängigkeit der anfallenden Datenmenge, spielt auch noch eine große Rolle, so dass man keine pauschalen Aussagen treffen kann, was nun schneller ist. Aber mal so prinzipiell gesehen muss bei einem Join zuerst die große Datenmenge erzeugt werden, dann kommt die Filterung der Where-Klausel dran. Wenn die bereits gefilterten Daten der einen Tabelle eine geringe Menge ergeben, sind dann wenige Subselects - noch dazu wenn sie über einen Index agehandelt werden können - schneller zu ermitteln. Aber wie gesagt, das kann je nach Datenmenge auch sorum und sorum enden.

              Das hieße dann ja, dass man für mehrere Werte, die benötigt werden, auch mehrere Subselects verwenden könnte/sollte? Das würde die gesamte Abfrage "modular" machen. Man könnte verschiedene interessante Abfragen vorbereiten und dann, wie in einem Funktionsbaukasten, zusammenstöpseln.

              Wie tief darf man Subselects (by MySQL) schachteln?

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bikers-lodge.com
              1. Tach!

                Das hieße dann ja, dass man für mehrere Werte, die benötigt werden, auch mehrere Subselects verwenden könnte/sollte?

                Ja. Nein. Vielleicht. Sicher kann man das treiben bis zum Umfallen, solange die Performance mitspielt. Der Wartungsaufwand wäre mir vermutlich zu hoch. Eine Stored Function bietet sich da möglicherweise an.

                dedlfix.

  2. Hello,

    ich möchte aus zwei Tabellen etwas auslesen.

    SELECT a.name, b.ort, b.art
    FROM name as a, ort as b
    where a.art_id = b.art_id

    Wie es richtig[tm] gemacht wird, list Du nach im Artikel

    http://wiki.selfhtml.org/wiki/Artikel:DBMS_und_SQL/Einführung_in_Joins
    http://wiki.selfhtml.org/wiki/Artikel:DBMS_und_SQL/Fortgeschrittene_Jointechniken

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bikers-lodge.com