我已经为此努力了2天。 这是我到目前为止所拥有的
BEGIN
DECLARE s TEXT DEFAULT '';
select
u.*,
h.*,
last_hash(h.ref) as `last_one`
from users u
join user_hash h
on h.ref = u.id
and h.hash = `last_one`
;
END
函数last_one
为尝试登录的用户返回表中的最后一个哈希(这意味着用户可以更改其密码,并且将保存旧哈希的副本,这意味着他们不能使用相同的密码)在设定的时间内再次输入密码)。
如果我在没有and h.hash = last_one
的情况下运行此程序,则会得到正确的结果,结果中将包含列last_one
。
但是,在该子句中,我收到一条错误消息,指出该列不存在。
Error Code: 1054. Unknown column 'last_one' in 'on clause'
如果在连接后将子句更改为where
子句,则会得到unknown column in 'where clause'
。
值得一提的是,我已经有了该版本的工作版本,但是如果可能的话,我希望只选择一个变量而没有任何变量。
出于任何原因,无法在联接内部或外部识别该列?
谢谢。
答案 0 :(得分:0)
可能适用于:
BEGIN
DECLARE s TEXT DEFAULT '';
select
u.*,
h.*,
last_hash(h.ref) as `last_one`
from users u
join user_hash h
on h.ref = u.id
and h.hash = last_hash(h.ref)
;
END
答案 1 :(得分:0)
您不能在ON子句中引用列别名(last_one
)。您需要在ON子句中重复函数调用:
select
u.*,
h.*,
last_hash(h.ref) as `last_one`
from users u
join user_hash h
on h.ref = u.id
and h.hash = last_hash(h.ref)
或将其用于HAVING子句或使用子查询。
但是-在这种情况下,由于h.hash = last_hash(h.ref)
是一个INNER JOIN,因此您可以将SELECT子句中的函数调用替换为h.hash
:
select
u.*,
h.*,
h.hash as `last_one`
from users u
join user_hash h
on h.ref = u.id
and h.hash = last_hash(h.ref)
并且由于h.ref = u.id
可以用last_hash(h.ref)
替换last_hash(u.id)
,因此应该可以提高性能。
答案 2 :(得分:0)
很抱歉,我在last_hash(int)
函数中犯了一个严重错误。发布此功能可能节省了我们所有的时间。生活和学习。
我将其设置为在哈希为VARCHAR(50)
时返回一个VARCHAR(128)
。更正此问题已解决。
我没有抓住它,因为如最初所述,当将last_hash(int)
函数添加为一列时,我得到的结果是所有128个字符,如果我只有50个,我会立即注意到。这使我认为查询是问题所在。
再次感谢您的时间。