我需要从“sys_acl_matrix”表中返回另外两个字段的值,但我不知道如何读取这些AS和LEFT JOIN的东西。
我需要添加的字段是:
AllowedCount
AllowedPeriodLen
这是查询
$GLOBALS['MySQL']->getAllWithKey(
"SELECT `ta`.`ID`
AS `id`, `ta`.`Name`
AS `title`
FROM `sys_acl_actions`
AS `ta`
LEFT JOIN `sys_acl_matrix`
AS `tm`
ON `ta`.`ID`=`tm`.`IDAction`
LEFT JOIN `sys_acl_levels`
AS `tl`
ON `tm`.`IDLevel`=`tl`.`ID`
WHERE `tl`.`ID`='" . $iMembId . "'
ORDER BY `ta`.`Name`", "id");
如果有人可以帮助我理解这个查询正在做什么也会很好。当谈到左连接时,我迷失了。
答案 0 :(得分:2)
由于格式不佳,很难阅读,但是:
$GLOBALS['MySQL']->getAllWithKey(
"SELECT `ta`.`ID` AS `id`,
`ta`.`Name` AS `title`,
`tm`.`AllowedCount`,
`tm`.`AllowedPeriodLen`
FROM `sys_acl_actions` AS `ta`
LEFT JOIN `sys_acl_matrix` AS `tm` ON `ta`.`ID` = `tm`.`IDAction`
LEFT JOIN `sys_acl_levels` AS `tl` ON `tm`.`IDLevel` = `tl`.`ID`
WHERE `tl`.`ID`='" . $iMembId . "'
ORDER BY `ta`.`Name`", "id");
我可能会取消所有反引号,并确保模式也不区分大小写,但我保持它们与问题保持一致。
在WHERE子句中使用$iMembId
也有SQL注入的可能性 - 如果用户在变量中提供了数据,则必须先将其清理,然后再将其添加到SQL中(记住Little Bobby Tables }!)。理想情况下,您在执行SQL时使用占位符(通常是问号)并提供$iMembId
的值作为关联值。
如果没有那些反引号,它就变成了:
$GLOBALS['MySQL']->getAllWithKey(
"SELECT ta.ID AS id,
ta.Name AS title,
tm.AllowedCount,
tm.AllowedPeriodLen
FROM sys_acl_actions AS ta
LEFT JOIN sys_acl_matrix AS tm ON ta.ID = tm.IDAction
LEFT JOIN sys_acl_levels AS tl ON tm.IDLevel = tl.ID
WHERE tl.ID = '" . $iMembId . "'
ORDER BY ta.Name", "id");
请注意,引号保留了内部标识符的大小写,因此您可能必须在无引号版本工作之前修改架构。
答案 1 :(得分:2)
左连接通常返回左侧表中的记录,如果有任何与左表关联的记录,则记录在右侧表中。但是左侧的记录仍然会被返回。
您的查询将导致sys_acl_matrix表中的记录。我没有看到您的查询返回其他2个表中的任何其他列。您只返回sys_acl_actions表中的2列。
答案 2 :(得分:2)
试
$GLOBALS['MySQL']->getAllWithKey(
"SELECT `ta`.`ID`
AS `id`, `ta`.`Name`
AS `title`,
`tm`.`AllowedCount`, `tm`.`AllowedPeriodLen`
FROM `sys_acl_actions`
AS `ta`
LEFT JOIN `sys_acl_matrix`
AS `tm`
ON `ta`.`ID`=`tm`.`IDAction`
LEFT JOIN `sys_acl_levels`
AS `tl`
ON `tm`.`IDLevel`=`tl`.`ID`
WHERE `tl`.`ID`='" . $iMembId . "'
ORDER BY `ta`.`Name`", "id");