2010-10-02 48 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");