我试图了解如何编写查询以区分用户是否可以访问某种表单。 我知道我在这里问的问题看起来很简单但是当我试图实现它时,它完全不同。 也许我做错了,但如果我做错了,请告诉我应该采用什么方法来实施解决方案。
开始之前我想在开头提到两个表名。
sys_forms
,sys_forms_in_groups
我也在我的问题的解释结束时放了一个SQLFIDDLE链接。所以,如果你可以编辑小提琴或者告诉我应该做些什么来实现我的目标。
这是我想要做的。
如果你能看到图片,在顶部下拉框(它的select2下拉列表中),用户选择该组,它将返回GroupID,我想在其上填充下面的数据表。 (DataTable只是显示组,它是一个虚拟的。但是它会显示表单,如果问题得到解决就会修复它)
现在问题出现了:
我希望数据表显示数据表中sys_forms
表中可用的所有表单,但在数据表的操作列中,只有那些复选框/开关应该显示在所选组中可以选择的组(可以为select2下拉列表选择组)如前所述)。
GroupID
是其他表sys_forms_in_groups
的列。
我想要的是,无论我选择哪个组,所有表单都应显示在数据表中,但如果组有权访问该特定表单,表中的Actions列应显示Granted
。
forms_in_groups
用于显示群组是否可以访问该特定表单。
电子克
FormID GroupID
------------------------------
1 1
2 1
1 2
FormID 1
同时适用于groupID 1
和2
,另一方面,FormID 2
仅适用于GroupID 1
。
我希望我确实解释了我的问题,我不是一个复杂的查询编码器。我只知道简单的查询。如果有人能帮我解决这个问题,我将非常感激。
请点击或点击以下链接:
打开SQLFIDDLE:http://sqlfiddle.com/#!2/1689a/2
SQL Fiddle不起作用,所以将屏幕截图放在这里。
table:sys_forms
table:sys_forms_in_groups
我已经尝试过这个查询,但它只返回所选组的表单,我希望所有表单都显示,但必须在复选框/ switchButtons上的Actions Columns中显示授权
SELECT * FROM (`sys_forms`) INNER JOIN `sys_forms_in_groups`
ON `sys_forms_in_groups`.`FormID` = `sys_forms`.`FormID` WHERE `GroupID` = 1;
答案 0 :(得分:0)
我认为您错误地尝试将问题卸载到MySQL上。
呈现表单并显示所选组是否可以访问特定表单,这不是MySQL的工作。这将落在你的页面渲染上;在这种情况下使用Select2。
您只想检索所有表单,然后显示所选组是否可以访问特定表单。这取决于一些Javascript,它会检查并正确显示它。
如果要返回所有表单,查询将为:
SELECT * FROM (`sys_forms`) INNER JOIN `sys_forms_in_groups`
ON `sys_forms_in_groups`.`FormID` = `sys_forms`.`FormID`;
如果您只想要组1可以访问的表单,那么查询就像您拥有的一样:
SELECT * FROM (`sys_forms`) INNER JOIN `sys_forms_in_groups`
ON `sys_forms_in_groups`.`FormID` = `sys_forms`.`FormID` WHERE `GroupID` = 1;
我没有做很多深入研究Select2,所以在这方面我无法帮助你。
答案 1 :(得分:0)
我可以从您的数据库架构中看到,根据您要查找的数据,内部联接是正确的选择。我能看到的唯一问题是在WHERE子句中。似乎它可能会尝试在GroupID
表中查找sys_forms
,因此请尝试指定。
SELECT * FROM (`sys_forms`) INNER JOIN `sys_forms_in_groups`
ON `sys_forms_in_groups`.`FormID` = `sys_forms`.`FormID` WHERE
`sys_forms_in_groups`.`GroupID` = 1;
答案 2 :(得分:0)
最后问题解决并且工作得非常好,但在解决了这个问题之后我发现还有一个我没想到的问题,但那是另一回事。的xD。 然而,这是一个有点粗糙的解决方法,但我得到了我想要的东西。
我是这样做的,
我首先需要将select
查询更新为
SELECT f.FormID
, f.FormName
, f.FormCIPath
, MAX(g.IsMenuLink) AS IsMenuLink
, GROUP_CONCAT(DISTINCT g.GroupID ORDER BY g.GroupID) AS GroupIDs
FROM `sys_forms` f
JOIN `sys_forms_in_groups` g
ON g.FormID = f.FormID
AND g.GroupID IN (1,2)
GROUP BY f.formID
在这里你可以看到它将返回属于组1和组2的所有表单,但是1和2将以逗号分隔的同一列中。
现在它如何显示。
我不是一个非常复杂的查询主人,所以我非常感谢stackoverflow社区帮助我查询。因为我想加入两个结果以逗号分隔值显示。
在MysQL之后,jquery的工作并不困难,我只发送了我希望结果显示在表格中的组ID。然后我得到了这个结果,我将GroupID与javascript split函数分开,然后我得到了我的组。
再次感谢大家。