SQL Abfrage, JOIN?
hawkmaster
- datenbank
0 Steel0 EKKi0 hawkmaster0 EKKi0 Vinzenz Mai0 Steel0 hawkmaster0 Steel
0 Danke an Alle
hawkmaster
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
Hi!
Welches Datenbanksystem benutzt Du? Kann es Subselects? Bedingte Anweisungen?
Wenns nicht unbedingt auf yes/no eintraege ankommt:
Schon nen outer join versucht?
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
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
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
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
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
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')?
?
Hallo,
Geht im select nicht sowas wie
if(colormode = 14, 'yes', 'no')?
?
das war heute für mich zu einfach :-)
Freundliche Grüße
Vinzenz
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
Hoi!
Hamse det AS ma hinta die Kontrollstruktua jepackt?
Danke an Alle für die Hilfe und Tipps.
Klappt nun wunderbar.
.. und wieder was dazugelernt :-)
vielen Dank und viele Grüße
hawk