[MySQL] Query: Alias wordt niet herkend in WHERE*

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hey tweakers,
Ik een gebruikerssysteem wil ik een selectie kunnen maken op grond van leeftijd. Nu had ik daar deze query voor gevonden:

code:
1
2
SELECT voornaam, DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(gebdatum)), '%Y')+0 AS leeftijd 
FROM leden


Werkt perfect. Geeft mooi de voornamen van de mensen plus de leeftijd. Maar nu komt het. Wanneer ik een voorwaarde maak met leeftijd gaat hij stijgeren. Zoiets bijvoorbeeld:

code:
1
2
3
SELECT voornaam, DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(gebdatum)), '%Y')+0 AS leeftijd 
FROM leden 
WHERE leeftijd > 18


Foutmelding:
Unknown column 'leeftijd' in 'where clause'
Vreemd want ik gebruik toch 'AS' om de kolom te benamen.
Can anyone help me?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:34
Welk DBMS gebruik je?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
MySQL, voor het testen gebruik ik phpMyAdmin (lijkt me geen probleem)..

[ Voor 0% gewijzigd door Verwijderd op 24-10-2002 19:50 . Reden: Tnx voor wijzigen topictitel :) ]


Acties:
  • 0 Henk 'm!

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 14:39

mulder

ik spuug op het trottoir

SELECT *, (DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(posted)), '%Y')) AS leeftijd
FROM news
WHERE (DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(posted)), '%Y')) > 18 LIMIT 0, 30

werkt bij mij wel. weet eigenlijk of dat andere mogelijk zou moeten zijn.

(query is enigzins aangepast, om te testen)

oogjes open, snaveltjes dicht


Acties:
  • 0 Henk 'm!

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Dit is inderdaad iets waar de meeste RDBMS-en niet tegen kunnen. Ik denk dat het komt doordat de filters worden uitgevoerd, voordat ie de select-list gaat samenstellen.
Aan de andere kant moet het een kleine moeite zijn voor de optimizer ofzo om de gebruikte alias in de WHERE te vervangen door de werkelijkheid.

Never underestimate the power of


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:34
cameodski schreef op 24 oktober 2002 @ 20:51:
Dit is inderdaad iets waar de meeste RDBMS-en niet tegen kunnen. Ik denk dat het komt doordat de filters worden uitgevoerd, voordat ie de select-list gaat samenstellen.
Aan de andere kant moet het een kleine moeite zijn voor de optimizer ofzo om de gebruikte alias in de WHERE te vervangen door de werkelijkheid.


Een serieus DBMS moet toch zonder problemen met aliassen kunnen omgaan.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Don Facundo schreef op 24 oktober 2002 @ 20:27:
SELECT *, (DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(posted)), '%Y')) AS leeftijd
FROM news
WHERE (DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(posted)), '%Y')) > 18 LIMIT 0, 30

werkt bij mij wel. weet eigenlijk of dat andere mogelijk zou moeten zijn.

(query is enigzins aangepast, om te testen)
Dank je!
Als het niet met aliassen kan dan maar zo he.. toch vind ik het een vreemd probleem.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ben nog eventjes door aan het testen, en het word steeds vreemder: In een WHERE voorwaarde herkent hij de alias niet, maar zodra ik gebruik ga maken van de COUNT() functie en groeperen, kan ik de alias echter wel met HAVING gebruiken..

Acties:
  • 0 Henk 'm!

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
whoami schreef op 24 oktober 2002 @ 22:44:
Een serieus DBMS moet toch zonder problemen met aliassen kunnen omgaan.
MSSQL vindt dat ook niet leuk en die is toch best wel serieus.
Verwijderd schreef op 24 oktober 2002 @ 23:27:
Ben nog eventjes door aan het testen, en het word steeds vreemder: In een WHERE voorwaarde herkent hij de alias niet, maar zodra ik gebruik ga maken van de COUNT() functie en groeperen, kan ik de alias echter wel met HAVING gebruiken..
Ook daar trapt MSSQL niet in, dus MS heeft in tegenstelling tot MySQL die functionaliteit blijkbaar consequent weggelaten en dus niet half. :P

Never underestimate the power of


Acties:
  • 0 Henk 'm!

  • nescafe
  • Registratie: Januari 2001
  • Laatst online: 16:19
Verwijderd schreef op 24 oktober 2002 @ 23:27:
Ben nog eventjes door aan het testen, en het word steeds vreemder: In een WHERE voorwaarde herkent hij de alias niet, maar zodra ik gebruik ga maken van de COUNT() functie en groeperen, kan ik de alias echter wel met HAVING gebruiken..
Dit lijkt me niet zo gek, omdat de HAVING clausule pas op het laatst wordt toegepast (na het selecteren en groeperen dus)

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


Acties:
  • 0 Henk 'm!

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
nescafe schreef op 25 oktober 2002 @ 00:06:
[...]

Dit lijkt me niet zo gek, omdat de HAVING clausule pas op het laatst wordt toegepast (na het selecteren en groeperen dus)
Nee, dat is niet het geval. Het selecteren gebeurt na groeperen en having. Having is per slot van rekening een soort filter die de resultset kan beperken. Als de select voor de having zou plaatsvinden, betekent dit dat er van alles voor noppes geselecteerd kan worden.
Ik houd het op een feature die per ongeluk in MySQL is ingebouwd.

Never underestimate the power of


Acties:
  • 0 Henk 'm!

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

cameodski schreef op 25 oktober 2002 @ 00:11:
Ik houd het op een feature die per ongeluk in MySQL is ingebouwd.
Ander treffend voorbeeld van een, imho, 'halve' implementatie is het includen van een column in je select list welke niet in de group by lijst voorkomt en ook geen resultaat is van een aggregate functie. (SELECT a, max(b), c FROM Tabel GROUP BY a)

Dus per ongeluk? Neuh, denk dat het meer als "iets makkelijks" is bestempeld en het daardoor in mysql terecht is gekomen.
offtopic:
Als je overigens kijkt naar de enorme lijst met (bijv. date en string) functies denk ik af en toe dat ze beter de tijd daarvoor hadden kunnen besteden aan een interne scripting taal (sprocs, triggers, enz.) of bijvoorbeeld subqueries :P

Today's subliminal thought is:


Acties:
  • 0 Henk 'm!

  • FragDaddy
  • Registratie: Mei 2000
  • Laatst online: 10:40
ik heb nog wel een voorbeeld van een probleem met mysql. subselects..

SELECT bestelling FROM tblBestelling where userID in
(SELECT userID FROM tblUser Where username='pietje')

dit is trouwens een query die ik even snel bedacht heb, maar die wel duidelijk aangeeft hoe handig een subselect kan zijn. natuurlijk kan ik dit ook doen met code en 2 losse SQL statements, maar dat is veel langzamer dan het door het DBMS laten oplossen.

ik begreep dat het met de nieuwe versie van MySQL opgelost is?

Have a wheelie good weekend!


Acties:
  • 0 Henk 'm!

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
FragDaddy schreef op 25 oktober 2002 @ 09:20:
ik heb nog wel een voorbeeld van een probleem met mysql. subselects..

SELECT bestelling FROM tblBestelling where userID in
(SELECT userID FROM tblUser Where username='pietje')
Deze is heel eenvoudig met een join op te lossen :) , maar subqueries horen inderdaad wel in een zichzelf respecterend DBMS te zitten.

Never underestimate the power of


Acties:
  • 0 Henk 'm!

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 10:25
Nou die query is er nou typisch 1 die je met een join kan oplossen.
SELECT bestelling FROM tblBestelling, tblUser
WHERE tblBestelling.userID = tblUser.userID
AND tblUser.username = 'pietje'
Ik weet alleen niet wat sneller is.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voorheen heb ik wel gewerkt met MS databases en daar werkt het perfect. Ik heb het nu wel voor elkaar maar op een zeer omslachtige manier (bij WHERE ipv de alias de hele statement aanroepen). Dit is dus echt een zwakte van MySQL
Pagina: 1