hawkmaster: SQL Abfrage, JOIN?

Hallo zusammen,

ich zerbreche mir nun schon eine ganze Weile den Kopf und komme dennoch nicht auf eine vernünftige Lösung.
Folgende SQL Abfrage bringt mir 5 Zeilen zurück von installierten Druckern.

  
    SELECT  
    	A.PrinterType, A.PrintSystemsID, B.PrinterTypeID, CONCAT(C.VendorName,', ',B.PrinterName) AS completename  
    FROM  
    	printsystems A  
    JOIN printertypes B ON B.PrinterType = A.PrinterType  
    JOIN printervendors C ON C.PrinterVendor_ID = B.PrinterVendor_ID  
    WHERE  
    	A.PWD = '1' AND A.PrintSystemsID != '1'  

In einer anderen Tabelle "printertypes_ppdvalues" stehen die Ausstattungen der Drucker. Mit der Abfrage:

  
SELECT `PrinterTypeID` FROM `printertypes_ppdvalues` WHERE `InstallElementsID` = 14 GROUP BY `PrinterTypeID`  

bekomme ich 3 Zeilen zurück. (InstallElementsID` = 14 bedeutet das der Drucker farbig drucken kann)

Ich versuche nun ob ich beide Abfragen in eine zusammenfassen kann.
Praktisch eine zusätzliche Spalte in der ersten Abfrage wo dann steht

ColorMode
yes
no
yes
..

Wenn ich es so versuche:

  
    SELECT  
    	A.PrinterType, A.PrintSystemsID, B.PrinterTypeID, CONCAT(C.VendorName,', ',B.PrinterName) AS completename, D.InstallElementsID AS ColorMode  
    FROM  
    	printsystems A  
    JOIN printertypes B ON B.PrinterType = A.PrinterType  
    JOIN printervendors C ON C.PrinterVendor_ID = B.PrinterVendor_ID  
LEFT JOIN printertypes_ppdvalues D ON D.PrinterTypeID = B.PrinterTypeID  
    WHERE  
    	A.PWD = '1' AND A.PrintSystemsID != '1' AND D.InstallElementsID = 14 GROUP BY A.PrintSystemsID  

Dann bekomme ich ja nur eine Zeile zurück weil ich ja mit "WHERE D.InstallElementsID = 14" die Suche einschränke.

Hat jemand eine Idee wie man das lösen könnte?
vielen Dank und viele Grüße
hawk

  1. Hi!

    Welches Datenbanksystem benutzt Du? Kann es Subselects? Bedingte Anweisungen?

    --
    "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
          - T. Pratchett
    1. Wenns nicht unbedingt auf yes/no eintraege ankommt:

      Schon nen outer join versucht?

      --
      "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
            - T. Pratchett
      1. Hallo,
        danke für deine Hilfe,
        nein , das mit yes / no war nur ein Beispiel.
        Mir würde auch langen das einfach NULL drin steht wenn halt nichts gefunden wird.
        Ich habe MySQL 5

        viele Grüße
        hawk

  2. Mahlzeit hawkmaster,

    SELECT
         A.PrinterType, A.PrintSystemsID, B.PrinterTypeID, CONCAT(C.VendorName,', ',B.PrinterName) AS completename, D.InstallElementsID AS ColorMode
        FROM
         printsystems A
        JOIN printertypes B ON B.PrinterType = A.PrinterType
        JOIN printervendors C ON C.PrinterVendor_ID = B.PrinterVendor_ID
    LEFT JOIN printertypes_ppdvalues D ON D.PrinterTypeID = B.PrinterTypeID

    Hier klebst Du die Werte aus der Tabelle "printertypes_ppdvalues" nur dann an die bisherige Ergebnismenge, wenn die "PrinterTypeID" jeweils übereinstimmt. Das bedeutet aber auch, dass es in der Spalte "ColorMode" durchaus Einträge geben kann, die NULL sind.

    WHERE
         A.PWD = '1' AND A.PrintSystemsID != '1' AND D.InstallElementsID = 14 GROUP BY A.PrintSystemsID

    Und hier machst Du Dir Dein LEFT JOIN von oben direkt wieder kaputt, weil Du leere Einträge gar nicht mehr zulässt.

    Du kannst in der ON-Klausel eines LEFT JOINs durchaus auch mehrere Kriterien angeben:

      LEFT JOIN printertypes_ppdvalues D ON (D.PrinterTypeID = B.PrinterTypeID AND D.InstallElementsID = 14)  
     WHERE A.PWD = '1' AND A.PrintSystemsID != '1' GROUP BY A.PrintSystemsID
    

    sollte ungefähr das tun, was Du vermutlich möchtest.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Hallo Ekki,
      fantastisch, das wars.
      vielen Dank für deine Hilfe.
      Ich wusste nicht das ich die ON Klausel noch erweitern kann.

      Mal noch ne Frage:
      ich bekomme jetzt wie gewünscht 5 Zeilen zurück wo es dann eine Spalte "ColorMode" gibt.
      Da wo was gefunden wird, gibt dann die ID 14 zurück also,

      ColorMode
      ------------
      NULL
      NULL
      14
      NULL
      NULL

      Ich habe noch nie mit "IF" ABfragen in SQL gearbeitet.
      Würde es eine Möglichkeit geben, das man ein ergebnis mit "yes/no" hat?
      Also "IF InstallElementsID 14 dann soll yes drin stehen wenn leer oder NULL dann no?

      vielen Dank und viele Grüße
      hawk

      1. Mahlzeit hawkmaster,

        Ich wusste nicht das ich die ON Klausel noch erweitern kann.

        Zitat aus http://dev.mysql.com/doc/refman/5.5/en/join.html:

        "The conditional_expr used with ON is any conditional expression of the form that can be used in a WHERE clause. Generally, you should use the ON clause for conditions that specify how to join tables, and the WHERE clause to restrict which rows you want in the result set."

        Ich habe noch nie mit "IF" ABfragen in SQL gearbeitet.

        Kein Problem, das kann man ändern ...

        Würde es eine Möglichkeit geben, das man ein ergebnis mit "yes/no" hat?

        Ja. :-)

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
      2. Hallo,

        Ich wusste nicht das ich die ON Klausel noch erweitern kann.

        tja, im Archiv steht's schon öfter, z.B:

        </archiv/2008/4/t170482/#m1114517>

        Da wo was gefunden wird, gibt dann die ID 14 zurück also,

        ColorMode

        NULL
        NULL
        14
        NULL
        NULL

        ich nähm' CASE. Mit IFNULL() und Konsorten wird's komplizierter:

        [link:http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#operator_case@title=CASE] Colormode  
            WHEN 14 THEN 'yes'  
            ELSE 'no'  
        END
        

        Freundliche Grüße

        Vinzenz

        1. Hi!

          ich nähm' CASE. Mit IFNULL() und Konsorten wird's komplizierter:

          Meinste? Mit mySQL hab ich da noch keine Erfahrung. Geht im select nicht sowas wie if(colormode = 14, 'yes', 'no')? ?

          --
          "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
                - T. Pratchett
          1. Hallo,

            Geht im select nicht sowas wie if(colormode = 14, 'yes', 'no')? ?

            das war heute für mich zu einfach :-)

            Freundliche Grüße

            Vinzenz

        2. Hallo Vinzenz,
          super, vielen Dank das ist schon mal klasse

          SELECT
               A.PrinterType, A.PrintSystemsID, B.PrinterTypeID, CONCAT(C.VendorName,', ',B.PrinterName) AS completename,  CASE D.InstallElementsID
              WHEN 14 THEN 'yes'
              ELSE 'no'
          END
              FROM
          ...

          Nur noch eine kleine Frage:
          Ich bekomme es nicht hin das auch die Spalte noch "ColorMode" heisst.
          Irgendwie die Kombination mit As geht so nicht;

          CASE D.InstallElementsID AS ColorMode
              WHEN 14 THEN 'yes'
              ELSE 'no'
          END
          ---------------------
          SELECT
               A.PrinterType, A.PrintSystemsID, B.PrinterTypeID, CONCAT(C.VendorName,', ',B.PrinterName) AS completename,  CASE D.InstallElementsID AS ColorMode
              WHEN 14 THEN 'yes'
              ELSE 'no'
          END
              FROM
          -------------------

          geht das überhaupt?

          Gruss
          hawk

          1. Hoi!

            Hamse det AS ma hinta die Kontrollstruktua jepackt?

            --
            "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
                  - T. Pratchett
  3. Danke an Alle für die Hilfe und Tipps.
    Klappt nun wunderbar.
    .. und wieder was dazugelernt :-)

    vielen Dank und viele Grüße
    hawk