将字段添加到复杂的SQL select语句中

时间:2010-10-02 03:26:35

标签: php mysql database

我需要从“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");

如果有人可以帮助我理解这个查询正在做什么也会很好。当谈到左连接时,我迷失了。

3 个答案:

答案 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列。

更多信息:http://www.tizag.com/mysqlTutorial/mysqlleftjoin.php

答案 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");