MySQL Problem: Unknown column

Joel

Legendäres Mitglied
Hallo zusammen,

Weiss vielleicht jemand, warum beim folgenden SQL-Statement die Column "userprice" nicht gefunden wird obwohl ich sie in der ersten Zeile als berechnetes SQL-Feld reingenommen habe?

CODE
Error
SQL query:

SELECT slots.slot_price / currency.currency_value *1 AS userprice, vendor. * , cat. * , usr. * , usr_contact. * , region. * , currency. *
FROM slots
LEFT JOIN vendor ON vendor.vendor_id = slots.vendor_id
LEFT JOIN cat ON cat.cat_id = slots.cat_id
LEFT JOIN usr ON usr.usr_id = slots.usr_id
LEFT JOIN usr_contact ON usr.contact_id = usr_contact.usr_contact_id
LEFT JOIN region ON usr_contact.region = region.id_region
LEFT JOIN currency ON currency_id = slot_price_currency
WHERE (
(
userprice >100
)
AND (
userprice <500
)
)
AND usr.status = 'activated'
ORDER BY slots.slot_id DESC
LIMIT 0 , 30

MySQL said:

#1054 - Unknown column 'userprice' in 'where clause'

 
QUOTE (madox @ So 18.2.2007, 12:38)
CODE WHERE (
(
userprice >100
)
AND (
userprice <500
)


Zumindest beim Microsoft-SqlServer geht das nicht, mySql wird das ähnlich handhaben.

Du kannst zwar einen berechneten Ausdruck als Spaltenausgabe angeben und diesem einen Namen zuweisen. Aber in GroupBy und Where-Klauseln müssen Spalten referenziert werden, nicht der Aliasname.

Alternative: Die Abfrage als Unterabfrage formulieren und die Spalte 'userprice' ausgeben, dann kann diese im übergeordneten Select mehrfach genutzt werden. Der Optimierer sollte das Kriterium dann eigentlich nach innen reinziehen.

Einzigste Ausnahme von dieser Regel: Für Sortierungen kann auch ein Aliasname genutzt werden.
 
jAuer hat da recht, nur kannst du bei mysql wenn es wirklich unbedingt so einfach wie möglich gemacht werden soll, HAVING verwenden. Hat allerdings neben dem Vorteil der Lesbarkeit auch eine Menge Nachteile, zb. ist die Abfrage fast ohne Geschwindigkeitsoptimierung.

Probier mal:
CODE SELECT slots.slot_price / currency.currency_value *1 AS userprice, vendor. * , cat. * , usr. * , usr_contact. * , region. * , currency. *
FROM slots
LEFT JOIN vendor ON vendor.vendor_id = slots.vendor_id
LEFT JOIN cat ON cat.cat_id = slots.cat_id
LEFT JOIN usr ON usr.usr_id = slots.usr_id
LEFT JOIN usr_contact ON usr.contact_id = usr_contact.usr_contact_id
LEFT JOIN region ON usr_contact.region = region.id_region
LEFT JOIN currency ON currency_id = slot_price_currency
HAVING (userprice >100) AND (userprice <500) AND (usr.status = 'activated')
ORDER BY slots.slot_id DESC
LIMIT 0 , 30
 
Vielen Dank! Es funktionieren beide Lösungen (Und ich kannte das HAVING-Statement vorher überhaupt nicht, wiedermal was gelernt
wink.gif
).
 
Zurück
Oben