使用一个一个的值进行查询,为一堆值工作

Making a query that works using one by one values, work for a bunch of values

我有这个查询,它从一堆 table 和函数中获取结果(我使用 MySQL workbench)。

是这样的:

SET @user_name := "any_username";
SELECT @user_id := user_id FROM main_db.user WHERE user_name=@user_name;
SELECT @available_balannce := JSON_EXTRACT(get_ewallet(@user_id),'$.available');
SELECT @current_commisions := JSON_EXTRACT(get_ewallet(@user_id),'$.current_commisions');
SELECT @commisions := JSON_EXTRACT(get_ewallet(@user_id),'$.commisions');
SELECT user_id, -- or you can use @user_id here. Since it's SET a bit higher
    user_name, 
    @available_balannce,
    @current_commisions,
    @commisions
    FROM main_db.user 
    where user_name=@user_name;

因此,如果您在第一行中键入任何用户名,它将为您获取所需的信息。结果当然是显示在 MySQL workbench.

的 window 中的单行 table

现在我想让它与一堆用户名一起工作,最好将其导出到同一 window 的几行下。然后我可以导出该结果。这只能通过 Workbench 界面使用。但是我不知道如何通过用户名列表执行循环过程。

我尝试定义列表:

SET @user_list := (SELECT user_name FROM main_db.user WHERE user_name IN ("username1","username2","username3","username4"));

然后使用 LIMIT 和 OFFSET

遍历它们
SET @user_name := @user_list LIMIT i,1;

但这没有用。我相信我迷路了试图从语法上弄清楚它。

您实际上不需要那么多语句来生成您想要的结果。相反,您可以这样做:

select
    user_id,
    json_extract(get_ewallet(user_id), '$.available'         ) as available_balance,
    json_extract(get_ewallet(user_id), '$.current_commisions') as current_commisions,
    json_extract(get_ewallet(user_id), '$.commisions'        ) as commisions
from main_db.user 
where user_name = @user_name;

现在这很容易扩展,可以同时处理多个用户。您只需将 where 子句更改为 in 条件,例如:

where user_name in ('username1', 'username2', 'username3', 'username4')

在 MySQL 的最新版本(8.0.14 或更高版本)中,您可以使用横向连接,因此每行只调用一次该函数:

select
    u.user_id,
    json_extract(e.ewallet, '$.available'         ) as available_balance,
    json_extract(e.ewallet, '$.current_commisions') as current_commisions,
    json_extract(e.ewallet, '$.commisions'        ) as commisions
from main_db.user u
left join lateral (select get_ewallet(u.user_id) as ewallet) e on true
where user_name = @user_name;