Использование агрегированных строковых функций в MySQL и PHP - PullRequest
0 голосов
/ 22 мая 2019

У меня сейчас проблема с перечислением с именем «Привилегия», где 0 = обычный, а 1 = привилегированный.Они назначаются на рабочие места, например, у работника есть обычные привилегии, но у генерального директора есть права администратора.Проблема, с которой я столкнулся, заключается в том, что у пользователя может быть два задания, одно из которых с правами обычного пользователя, а другое с правами администратора.Я написал запрос, чтобы начать сеансы в зависимости от привилегии, однако, когда я использую группирование по StaffID, я не уверен, как группировать по наивысшей привилегии (1 имеет место).

Например,

else if ($pwdCheck == True){
    session_start();
    $query = mysqli_query($conn, 'SELECT staff.StaffID, role.Privilege FROM jobs
         INNER JOIN staff ON staff.StaffID = jobs.StaffID
         INNER JOIN role ON role.RoleID = jobs.RoleID GROUP BY StaffID
    ');

    $gettier = mysqli_fetch_assoc($query);
    if($gettier["Privilege"] === 'normal'){
        $_SESSION['userID'] = $row['LoginID'];
        header("Location: staffindex.php?login=USERsuccess");
    }
    elseif($gettier["Privilege"] === 'privileged'){
        $_SESSION['AdminID'] = $row['LoginID'];
        header("Location: staffindex.php?login=ADMINsuccess");
    }
    exit();
}

. Во всех случаях, когда я вхожу в привилегированное лицо, я все еще перенаправлен с заголовком USERsuccess.Я предполагаю, что мне нужно будет использовать функцию агрегирования строк (после некоторого исследования), но я не совсем понимаю, как ее применить.

Пожалуйста, просмотрите изображение, чтобы увидеть запрос в действии:
С Group By: https://imgur.com/ADT0aHF
Без группировки по: https://imgur.com/UDeyKe5

Любая помощь приветствуется.

1 Ответ

1 голос
/ 22 мая 2019

К сожалению, MySQL не сортирует значения enum численно, а вместо этого по строковому представлению, в противном случае вы можете просто использовать MAX непосредственно для значений. Но вы можете отсортировать CAST значения в виде целых чисел, например

SELECT staff.StaffID, MAX(CAST(role.Privilege AS UNSIGNED)) AS Privilege FROM jobs
INNER JOIN staff ON staff.StaffID = jobs.StaffID
INNER JOIN role ON role.RoleID = jobs.RoleID GROUP BY StaffID

Предполагая, что ваш ENUM имеет значения ('normal', 'privileged'), будет возвращено значение 1 для пользователя с привилегией normal и 2 для пользователя с привилегией privileged или обоими normal и privileged. Затем вы можете изменить чек в вашем PHP на:

if($gettier["Privilege"] == 1){
    $_SESSION['userID'] = $row['LoginID'];
    header("Location: staffindex.php?login=USERsuccess");
}
elseif($gettier["Privilege"] == 2){
    $_SESSION['AdminID'] = $row['LoginID'];
    header("Location: staffindex.php?login=ADMINsuccess");
}

Обратите внимание, что вы не можете использовать === в сравнении с $gettier["Privilege"], поскольку значения, возвращаемые в запросе, будут строками, а не целыми числами.

...