无法内部加入

时间:2019-09-18 18:47:27

标签: mysql join

我已经为此努力了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'。 值得一提的是,我已经有了该版本的工作版本,但是如果可能的话,我希望只选择一个变量而没有任何变量。 出于任何原因,无法在联接内部或外部识别该列?

谢谢。

3 个答案:

答案 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个,我会立即注意到。这使我认为查询是问题所在。

再次感谢您的时间。