簡體   English   中英

如何讓mysql Group_Concat與其他CONCAT信息一起使用?

[英]How to get mysql Group_Concat to work with additional CONCAT information?

我正在開發一個帶有mysql的Web應用程序,其中涉及一個用戶角色表,其中存儲了權限級別以及角色ID,並與用戶名及其ID相關聯(冗余以繼續支持遺留代碼)。

我希望能夠以簡單的英語顯示每個用戶的角色作為逗號分隔列表,對數據庫(> 1k用戶)的最小命中以及他們的權限級別。

權限存儲為ismanager和ishead列中的位,而roleid則鍵入define_roles(id,rolename)

這是我的工作(但沒有顯示用戶級別)

<?
$rolenames = array();
foreach($db->query("SELECT id, rolename FROM define_roles") as $row)
{
    $rolenames[$row['id']] = $row['rolename'];
}

foreach($db->query("SELECT DISTINCT userid, username, 
                        GROUP_CONCAT(DISTINCT roleid  ORDER BY roleid) AS idlist
                        FROM user_roles 
                        GROUP BY userid 
                        ORDER BY username ASC") as $row)
{
    $rolestring = '';
    //echo $row['idlist'];
    foreach(explode(',',$row['idlist']) as $id)
    {
        $rolestring .= " ".$rolenames[$id].",";
    }
    $rolestring = rtrim($rolestring,',');

    echo "<tbody>
            <tr>
                <td><font size='1'>" . $row['username'] . "</font></td>
                <td><font size='1'>" .$rolestring. "</font></td>
            </tr>";
}
?>

輸出:

  • TestUser銷售
  • UserTest2 Sales,Mailroom,Janitorial

我想看到的是

  • TestUser銷售(經理)
  • UserTest2銷售,郵件室(主管),門衛(經理)

我能想到的最好(盡管它不起作用)是:

$rolenames = array();
foreach($db->query("SELECT id, rolename FROM define_roles") as $row)
{
    $rolenames[$row['id']] = $row['rolename'];
    $rolenames[$row['id']."10"] = $row['rolename']." (Manager)";
    $rolenames[$row['id']."01"] = $row['rolename']." (Head)";
    $rolenames[$row['id']."11"] = $row['rolename']." (Head)";
}

foreach($db->query("SELECT DISTINCT userid, username, 
                        GROUP_CONCAT
                        (
                            CONCAT(roleid,ismanager,ishead) ORDER BY roleid
                        ) AS idlist
                        FROM user_roles 
                        GROUP BY userid 
                        ORDER BY username ASC") as $row)

首先,您應該規范化數據庫,以便有一個單獨的表鏈接用戶和已定義的角色。 但這是一個單獨的事情,我感謝你可能無法做到這一點。

如果我已經正確理解了你桌子上的內容,答案就是這個,我想:

SELECT 
    userid, 
    username, 
    GROUP_CONCAT(DISTINCT 
        CONCAT(
            (SELECT d.rolename FROM define_roles AS d
            WHERE d.id = roleid)
        ), 
        IF(ismanager = 1, " (Manager)", ""),
        IF(ishead = 1, " (Head)", "")
    ) AS roles
FROM user_roles
GROUP BY userid;

您不需要初始sql,您可以從define_roles中查找角色名稱。

[編輯]:抱歉,更新內部SELECT周圍的括號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM