我的select语句运行正常:
SELECT
pre, dict.char, post, score
, (SELECT @res := MatchPre(pre, 'test') AS var) AS mpre
FROM dict;
它正确地返回所有数据,其中MatchPre的结果位于标有“mpre”的列中。但是,我想只获得mpre>的结果。所以,从逻辑上讲,我试过这个:
SELECT
pre, dict.char, post, score
, (SELECT @res := MatchPre(pre, 'test') AS var) AS mpre
FROM dict
WHERE mpre > 0;
但无济于事。我尝试用“WHERE @res> 0”,“WHERE @ res.mpre> 0”,“WHERE mpre。@ res> 0”等交换“WHERE mpre> 0”,但它要么抛出一个错误或返回一个空的结果集,尽管原始的where-less查询给出了mpre值大于0的行。
这个的正确语法是什么?
答案 0 :(得分:6)
SELECT
pre, dict.char, post, score
, (SELECT @res := MatchPre(pre, 'test') AS var) AS mpre
FROM dict
HAVING mpre > 0;
您不能在where
子句中使用别名
您将不得不使用having
子句或将带有别名的select放在另一个外部选择中。
这是因为当运行where
子句时,尚未评估别名
所有having
,select
,where
,group by
和from
完成后joins
后运行不受此限制。
虽然不能使用索引
如果要使用索引,请使用子选择。
SELECT sub.* FROM
(SELECT
pre, dict.char, post, score
, (SELECT @res := MatchPre(pre, 'test') AS var) AS mpre
FROM dict ) sub
WHERE sub.mpre > 0