MySQL: If Anweisung innerhalb Datenbankabfrage

Murkasfjphy

Grünschnabel
Hallo,

Ich habe eine Frage zu einer IF Anweisung innerhlalb einer Datenbankabfrage:

if (proz_aufschlag>0, db1.artikel.".$vk2." * proz_aufschlag, 0) as vkpreis

und zwar wird in der darauffolgenden where Bedingung über "vkpreis" gemeckert. Im folgenden die Original Fehlermeldung: "Unknown column 'vkpreis' in 'where clause'"

Und hier die gesamte Abfrage:

select distinct db1.artikel.*, db2.preistabelle.von_preis, db2.preistabelle.bis_preis, db2.preistabelle.euro_aufschlag, db2.preistabelle.proz_aufschlag, db2.preistabelle.auf_ab,
if (euro_aufschlag>0, db1.artikel.".$vk2." * euro_aufschlag, 0) as vkpreis,
if (proz_aufschlag>0, db1.artikel.".$vk2." * proz_aufschlag, 0) as vkpreis
from db1.artikel, db2.preistabelle
where ((vkpreis > db2.preistabelle.von_preis) and (db1.artikel.".$vk2." <= db2.preistabelle.bis_preis)) ";

Hat jemand eine Ahung was ich da falsch gemacht habe?

Vielen Dank

Mu
 
Aliasfelder können nicht in der WHERE-Klausel verwendet werden.
Du musst denselben Wert in der WHERE-Klausel erneut berechnen.
Der Grund hierfür liegt in der Vereinfachung der internen Optimierung. Es sollen einfach keine Felder berechnet werden, die eventuell nicht benötigt werden. Daher werden Aliasfelder grundsätzlich erst zum Schluss berechnet, wenn sicher ist, dass die Zeile auch in die Ergebnistabelle übernommen wird.

Gruß hpvw

EDIT:
PS: Übrigends Klasse, dass endlich mal jemand das DBMS, das Query und die Fehlermeldung angibt.
 
Hallo hpvw,

vielen Dank für die Superschnelle Antwort

hpvw hat gesagt.:
Aliasfelder können nicht in der WHERE-Klausel verwendet werden.
Du musst denselben Wert in der WHERE-Klausel erneut berechnen.
Gruß hpvw.

Aber wie soll das aussehen?
Die beiden If Abfragen noch einmal in der WHERE-Klausel einbauen?
Wärst Du so nett und würdest das mal kurz zeigen?

Nochmals Tausend Dank

Mu
 
Murkasfjphy hat gesagt.:
Aber wie soll das aussehen?
Die beiden If Abfragen noch einmal in der WHERE-Klausel einbauen?
Leider genau so.
Du kopierst alles, was vor dem AS steht und kopierst es anstelle des Aliasfeldbezeichners in die WHERE-Klausel.
Wenn Du die Felder in der Ergebnistabelle nicht benötigst, solltest Du sie aus der Projektion entfernen, damit die Werte nicht zweimal berechnet werden müssen.

Gruß hpvw
 
Hallo,

SUPER, das funktioniert jetzt.
Zumindest läuft es ohne Fehlermeldung durch.

Jetzt habe ich aber noch eine Frage:
Wie komme ich in php4 an den Wert in "vkpreis"?

Ich lese die Daten nach der Abfrage ungefähr so aus der Tabelle aus:
if (!$result_db1 = mysql_select_db($dbname_db1)) {$err=mysql_error();return(3);}
if (!$result_db2 = mysql_select_db($dbname_db2)) {$err=mysql_error();return(3);}
if (!$result = mysql_query($query)) {$err=mysql_error(); return(3);}
while ($row = mysql_fetch_array($result))
{
$KB_Preis = stripslashes($row[$VK1]);
$VK_Preis = stripslashes($row[$VK2]); /* So war es voher */
$VK_Preis = $vkpreis; /* So geht es leider nicht */
$AK_Preis = stripslashes($row[$VK3]);
$Bild = stripslashes($row["Bild"]);
}

Vielen Dank für alles!

Gruß Mu
 
Zuletzt bearbeitet:
Wenn Du den vkpreis noch benötigst, hast Du ihn hoffentlich nicht aus der Projektion entfernt, die Berechnung steht also zwei mal in Deinem Query. Dann kannst Du darauf in der auslesenden Schleife wie auf jedes andere Feld auch zugreifen:
PHP:
$vkPreis=$row['vkpreis'];

Gruß hpvw
 
Hi,

also es wird immer besser, habe schon die ersten korrekten Ergebnisse daraus. Jetzt kommen noch Detail-Verbesserungen und da gibt es noch eine Frage:

Ich berechen den Preis-Aufschlag und weise das Ergebnis unterschiedlichen Variablen zu:
if (euro_aufschlag>0, $vk2 + euro_aufschlag, 0) as euro_vkpreis,
if (proz_aufschlag>0, $vk2 * (proz_aufschlag/100), 0) as proz_vkpreis,

Weil nur in einer der beiden Variablen euro_vkpreis oder proz_vkpreis ein Wert enthalten sein kann, möchte ich nun ermitteln in welcher Variable der Wert steht und dieser einer dritten Variable vkpreis zuordnen.

So habe ich mir das gedacht, aber er zeigt mir einen Fehler an, woran kann das liegen?
if (euro_vkpreis>0, euro_vkpreis, proz_vkpreis) as vkpreis

Danke + Gruß

Mu
 
Vielleicht so?
Code:
GREATEST(if (euro_aufschlag>0, $vk2 + euro_aufschlag, 0),
  if (proz_aufschlag>0, $vk2 * (proz_aufschlag/100), 0),
  $vk2
) AS vkpreis,
if (euro_aufschlag>0,'EURO',
  if (proz_aufschlag>0, 'PROZ', '')
) AS aufschlagtyp
 
Suuuuppppiiii,

es ist geschafft.

Tausend Dank an hpvw!
Ohne Deine Hilfe die fast rund um die Uhr sowie am Wochenende zur Verfügung stand, hätte das vermutlich ein wenig (von ein paar Tagen bis hin zu einigen Wochen ...) länger gedauert.

Deshab noch einmal meinen allerherzlichsten Dank.
Natürlich komme ich sehr gerne wieder hierher...


Grüße

Marcel
 
Sorry, aber ein Haken ist doch noch irgendwo!

Offline funktioniert alles perfekt, aber nun wollte ich damit Online auf den Webserver. Und da kommt nun die folgende Fehlermeldung:

Access denied for user: 'db123456@%' to database 'db789234'

Die Abfrage geht ja über 2 Datenbanken, und das seltsame an der obigen Fehlermeldung ist, das user und database nicht zusammenpassen. Sondern jeweils von der anderen Datenbank sind.

Was kann denn da passiert sein?

Danke und Gruß

Marcel
 

Neue Beiträge

Zurück