mySQL:将视图和存储函数与动态参数结合起来

时间:2017-01-10 13:08:13

标签: mysql sql

我有一个视图,其中列出了我的网络应用所需的所有信息。该视图由select语句,连接和一些if-else子句组成。

现在我想在视图中使用存储函数的结果获得另一列。但是必须使用参数作为参数调用该函数。我不知道如何才能做到这一点。

我的观点如下:

VIEW 'app' AS SELECT 'user'.'user_id' AS 'user_id', 'user'.'name' AS 'name'...

这是我的函数的查询,它取决于u_id(在本例中为103):

SELECT IFNULL((
     SELECT !overdue FROM history JOIN status ON history.u_id = status.u_id 
        WHERE history.executed > IFNULL(status.last,0) 
        AND history.u_id = 103 
        ORDER BY history.executed DESC 
     LIMIT 1),0)

目前我的观看结果如下:

user_id --- name --- created
-------------------------------
103         Peter    2017-02-02
104         Bob      2017-02-01

我希望它有这样的,而逾期是该功能的结果:

user_id --- name --- created --- overdue
----------------------------------------
103         Peter    2017-02-02     1
104         Bob      2017-02-01     0

我想在我的视图中的每个'user_id'上调用此函数,并将结果显示在附加列中(在视图中)。谢谢你的帮助。

修改

所以我只是按照建议从函数中获取了查询,但它只为每个u_id显示相同的值。看起来IN运算符在这里是错误的。

SELECT u_id, IFNULL((
     SELECT !overdue FROM history JOIN status ON history.u_id = status.u_id 
        WHERE history.executed > IFNULL(status.last,0) 
        AND history.u_id IN (select distinct u_id from app) 
        ORDER BY history.executed DESC 
     LIMIT 1),0) from app

如果我更改条目,则每个其他条目都返回相同的结果。所以首先我有:

u_id --- overdue
103        0
104        0

如果我在103中更改了某些内容,这是在select查询中处理的:

u_id --- overdue
103        1
104        1

两者都改变​​了!

编辑2:

这是我的功能:

begin
declare r int(1); 
SET r= (SELECT IFNULL((SELECT !overdue FROM history JOIN status 
    ON history.u_id = status.u_id 
    WHERE history.executed > IFNULL(status.last,0) 
    AND history.u_id IN (select distinct u_id from app) 
    ORDER BY history.executed DESC 
 LIMIT 1),0));  
return r;
END

我从这样的观点来称呼它:

if((`overdue_fct`() = 1),'overdue','not overdue') AS 'overdue'

1 个答案:

答案 0 :(得分:0)

我相信您可以使用IN运算符并在您的函数中包含该条件,如

SELECT IFNULL((
     SELECT !overdue FROM history JOIN status ON history.u_id = status.u_id 
        WHERE history.executed > IFNULL(status.last,0) 
        AND history.u_id IN (select distinct user_id from app) //this line
        ORDER BY history.executed DESC 
     LIMIT 1),0)