mysql, Abfrage, wenn var grösser 0, dann wert aus anderer Table
simmel
- datenbank
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
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
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
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
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
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.
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
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.
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