Добавление полей в сложный оператор выбора SQL - PullRequest
1 голос
/ 02 октября 2010

Мне нужно вернуть значения еще двух полей из таблицы "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 ]

2 голосов
/ 02 октября 2010

Левое объединение обычно возвращает записи в левой таблице и записи в правой стороне таблицы, если они есть, которые связаны с левой таблицей. Но записи в левой части будут возвращены в любом случае.

Вашзапрос приведет к записи в таблице sys_acl_matrix. Я не вижу, чтобы ваш запрос возвращал какие-либо другие столбцы из двух других таблиц. Вы только возвращаете 2 столбца из таблицы sys_acl_actions.

2 голосов
/ 02 октября 2010

1001 * попробовать *


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

2 голосов
/ 02 октября 2010

Это трудно прочитать, потому что он плохо отформатирован, но:

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

Я бы, вероятно, покончил со всеми обратными кавычками и убедился, что схема также не учитывает регистр, но я сохранилдля согласованности с вопросом.

У вас также есть возможность внедрения SQL с использованием $iMembId в предложении WHERE - если пользователи предоставили данные в переменную, вы должны санировать их перед добавлением вВаш SQL (Помните Таблицы Бобби !).В идеале вы должны использовать заполнитель (обычно знак вопроса) и указывать значение $iMembId в качестве связанного значения при выполнении SQL.

Без этих обратных кавычек оно становится:

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

Обратите внимание, что в кавычках сохраняется регистр идентификаторов внутри, так что вам, вероятно, придется изменить свою схему, прежде чем работает версия без кавычек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...