我正在编写一个查询,该查询调用employee name
,employee's username
,security level
,menu
,menu's tabs
和menu descriptions
。我希望查询仅将employee name
和username
作为列显示一次,然后显示security level
,menu
,menu tabs
和{{1 }}。
menu description
我会发布我的输出,但是它很大,所以我要总结一下我收到的信息。
Select usname as Name,
Ususer as Username,
Uswosecl as WO_SecurityLevel,
AoOpID as Operation_ID, aoseclevel as Operation_Security,
AoMenu as Menu, AoMenuItem as Tab, AoText as Description
from cudtatet.xxpuser
join fmsusrfua.xxpauops on uswosecl >= aoseclevel
and aoseclevel >= 0
where ususer NOT IN (‘*ALL’,’daffron’)
and aoAuOpID >=70000 and aoAuOpID < 80000
order by usname, ususer
我希望收到的输出是:
NAME USERNAME SEC LEVEL MENU TAB DESC
AIKO R. ariggins 4 HELP TIME ENTRY MESSAGES
AIKO R. ariggins 4 HELP ABOUT ABOUT
AKIO R. ariggins 4 HELP CHANGEPASS CHANGEPASS
.......
我正在将该查询放入结果集中。如果可以通过查询完成,那就太好了。如果我需要在我的应用程序代码中执行此操作,则由于我不确定如何产生此输出,因此也会提供一些指导。
答案 0 :(得分:0)
这类事情通常是在应用程序代码(java,php等)中完成的。
MySQL可以内部使用称为GROUP_CONCAT()
的非标准聚合函数来完成此操作
尝试类似....(未调试)。
Select usname as Name,
Ususer as Username,
Uswosecl as WO_SecurityLevel,
AoOpID as Operation_ID, aoseclevel as Operation_Security,
GROUP_CONCAT(CONCAT( AoMenu, '>' , AoMenuItem , '>', AoMenuItem )) menu
from whatever
join whatever ON ....
where ...
group by usname Ususer, Uswosecl, AoOpID, aoseclevel
order by usname, ususer
根据每个用户有多少个不同的菜单详细信息,您可能想使用
SET group_concat_max_len = 10000;
因此列表不会被截断。您可以使用任何合理的长度。如果您有数百个项目,则可能需要查看max-packet-length。
答案 1 :(得分:0)
我个人认为查询不是进行格式化的正确位置。取而代之的是,我需要查询返回列中的数据,然后在我的代码或报告软件中对其进行格式化。
但是,要回答您的问题,您可以合并用户列表以获取名称,然后对结果进行排序以使菜单散布着权限。 row_number用于隐藏第一项上的菜单。
注意:为了简化起见,我删除了一些字段,但是您可以将它们重新添加。
SELECT case when x.MenuName IS NULL THEN 'Name: ' + x.Name + ' UserName: ' + x.UserName'
ELSE case when rn=1 then 'Menu: ' else ' ' end + x.Menu END Output
FROM
(Select usname Name, Ususer UserName, NULL Menu, 0 rn
From cudtatet.xxpuser
UNION
Select usname as Name,
Ususer as Username,
AoMenu as Menu,
Row_Number() Over (Partition BY usname Order BY AoMenu) rn
from cudtatet.xxpuser
join fmsusrfua.xxpauops on uswosecl >= aoseclevel
and aoseclevel >= 0
where ususer NOT IN (‘*ALL’,’daffron’)
and aoAuOpID >=70000 and aoAuOpID < 80000)
) x
ORDER BY x.Name, x.rn