2010-10-02 47 views
1

我需要从“sys_acl_matrix”表中返回两个字段的值,但我不知道如何读取这些AS和LEFT JOIN的东西。将字段添加到复杂的SQL select语句

我需要补充的领域是:

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

这也将是很好,如果有人可以帮助我了解一下这个查询正在进行。谈到左连接,我迷失了方向。

回答

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

注意,虽然,报价保持标识符的情况里面,所以你可能有quoteless版本的Works之前修改您的架构。

+0

大,所以什么以旧换新,TA和TL吗? – tmartin314 2010-10-02 03:48:40

+0

它们是表的别名 - 如果明智地书写(不含引号),则表示您可以使用双字母表缩写来编写查询。围绕别名使用引号特别奇怪。 – 2010-10-02 03:50:09

2

左连接通常返回左侧表中的记录和右侧表中的记录,如果有任何与左侧表关联的记录,但左侧的记录将返回。

您的查询将导致sys_acl_matrix表中的记录。我看不到您的查询返回其他两个表中的任何其他列。您仅从sys_acl_actions表返回2列。

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

+0

该查询很难阅读,但表格连接了'ta - > tm - > tl',但WHERE子句中的条件在'tl'上。因此,FROM子句将生成一个结果集(稍微奇怪),但是WHERE子句将会消除该结果集中的许多行。幸运的是,优化器会将WHERE子句条件向下推入连接,以将数据集减少到最小。因此,我同意LEFT JOIN有点奇怪 - 但有理由列出所有三张表。 – 2010-10-02 04:02:18

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