MySql Abfrage deutschlich schneller machen!

Column 'lager' in where clause is ambiguous
Das Feld Lager ist in zwei Tabellen vorhanden und somit weiss der SQL-PArser nicht, welches Feld für die WHERE-Klausel verwendet werden soll.

Richtig müsste es so heissen:
WHERE l.lager = '2' AND l.regal = '1' AND l.hoehe = '1' AND l.fach = '1'
Code:
Da auch regal, hoehe und fach mehrfach vorhanden sind, müssen auch diese Felder mit dem Tabellenalias versehen werden!

Grundsätzlich gilt: sobald Tabellen-Aliase vorhanden sind, sollte man IMMER diesen auch für die Felder verwenden - damit eben nicht wie oben solche Fehler produziert werden; ausserdem dient es der besseren Lesbarkeit und dem Verständnis.

Gruß
Rainer
 
HI an alle

Vielen Danke für eure Hilfe

Ich habe doch keine Ahnung von LEFT JOIN oder RIGHT JOIN und was es alle noch gibt.
Ich werde es jetzt an diesem Beispiel anfangen zu lernen.

Die Select Anweissung scheint jetzt richtig zu sein.
Nur weiss ich nicht wie ich das Ergebnis anzeigen lassen kann.

Hier erhalte ich Ergebnis.
SQL:
	$sql_3 = "SELECT lager, regal, hoehe, fach, COUNT(*) AS anzahl, SUM(meter) AS meter FROM weilhammer_datenbank WHERE lager = '$lager' AND  regal = '$regal' AND hoehe = '$hoehe' AND fach = '$fach' GROUP BY lager, regal, hoehe, fach";
	$sql_3_result = mysql_query($sql_3);  
	$myrow = mysql_fetch_array($sql_3_result, MYSQL_ASSOC);
	echo $myrow['anzahl']

Hier nicht.
SQL:
	$sql_3 = " SELECT l.lager, l.regal, l.hoehe, l.fach   , COUNT(*) AS anzahl , SUM(CASE WHEN d.meter IS NULL THEN 0 ELSE d.meter END) AS meter
FROM weilhammer_lager_2 l  LEFT JOIN weilhammer_datenbank d ON  d.lager = 'l.lager' AND d.regal = 'l.regal' AND d.hoehe = 'l.hoehe' AND d.fach = 'l.fach'
WHERE l.lager = '2' AND l.regal = '1' AND l.hoehe = '1' AND l.fach = '1' GROUP BY l.lager, l.regal, l.hoehe, l.fach
";
	$sql_3_result = mysql_query($sql_3);  
	$myrow = mysql_fetch_array($sql_3_result, MYSQL_ASSOC);
	echo $myrow['anzahl']
Erschlagt mich bitte nicht, wenn meine Frage allzu doof sein sollte. (Werde JOIN lernen. :) )

Gruß Thomas

SQL:
SELECT lager, regal, hoehe, fach, COUNT(*) AS anzahl, SUM(meter) AS meter FROM weilhammer_datenbank WHERE lager = '2' AND regal = '1' AND hoehe = '1' AND fach = '1' GROUP BY lager, regal, hoehe, fach

RICHTIGES ERGEBNIS
Es sind 6 Datensätze vorhanden.
Es sind 15.0 Meter vorhanden.

SQL:
SELECT l.lager, l.regal, l.hoehe, l.fach , COUNT(*) AS anzahl , SUM(CASE WHEN d.meter IS NULL THEN 0 ELSE d.meter END) AS meter FROM weilhammer_lager_2 l LEFT JOIN weilhammer_datenbank d ON d.lager = 'l.lager' AND d.regal = 'l.regal' AND d.hoehe = 'l.hoehe' AND d.fach = 'l.fach' WHERE l.lager = '2' AND l.regal = '1' AND l.hoehe = '1' AND l.fach = '1' GROUP BY l.lager, l.regal, l.hoehe, l.fach
FALSCHES ERGEBNIS
Es sind 1 Datensätze vorhanden.
Es sind 0.0 Meter vorhanden.
 
Zuletzt bearbeitet:
Könntest du bitte den Code in "SQL-BBCodes" setzen? Das kann ja kein Mensch lesen.

Desweitern fällt mir auf das du die Zuordnungen in hochkommas gesetzt hast. Wenn das Felder aus der DB sind, ist das nicht nötig:

SQL:
SELECT
   l.lager,
   l.regal,
   l.hoehe,
   l.fach,
   COUNT(*) AS anzahl,
   SUM(CASE WHEN d.meter IS NULL THEN 0 ELSE d.meter END) AS meter

   FROM weilhammer_lager_2 l

   LEFT JOIN weilhammer_datenbank d ON d.lager = l.lager AND d.regal = l.regal AND d.hoehe = l.hoehe AND d.fach = l.fach

   WHERE l.lager = '2' AND l.regal = '1' AND l.hoehe = '1' AND l.fach = '1' GROUP BY l.lager, l.regal, l.hoehe, l.fach
 
Hi Maniac

Es waren die Hochkommas.

Danke :D


Zur Info
Die Abfarge von einfach nur crack
Seitenaufbau in 19 Minuten und 20 Sekunden.

Die Abfrage von franz007
Seitenaufbau in 19 Minuten und 23 Sekunden

Bei 1000 Abfragen

Danke nochmal an alle.
 
Hallo saftmeister

Kanns du mir ein kleines Beispiel wie ein guter Aufbau eines Index (Indizes) für meine 2 Tabellen ausehen könnte?

Lese zur Zeit h**p://***.oreilly.de/catalog/hpmysqlger/chapter/ch04.pdf.

Bissel kompliziert.

Gruß Thomas
 
Ich würde jeweils einen regulären INDEX auf die Spalten in den Tabellen legen, die in der WHERE-Condition auftauchen, also vorwiegend regal, lager, hoehe und fach.

Du kannst auch EXPLAIN verwenden, um herauszufinden, wie der SQL-Planer dein Query auflöst. Meine Vermutung ist, dass wenn du jeweils einen INDEX auf die Spalten legst, dass es noch mal einen Performance-Schub geben könnte. Du kannst mit EXPLAIN eine Vorher-Nachher-Analyse durch führen. Ggf. kannst du den Index ja wieder löschen, wenn es nix bringt.
 
Zurück