0

我正在用 Python、PyQt4 和 MySQL 开发一个应用程序。

我有一个包含员工详细信息(id、empID、name、permissions)权限的表将包含逗号分隔的数据,其中包含员工正在工作的 project_empID。

示例表发布在SQLFIDDLE

我需要一个查询来检索数据,如下所示

empId   Name    Superior
1863     Rao     NULL
P4557    Kuri    NULL
P4645    Deep    Rao - 1863
P6682    Sha     Kuri - P4557,Rao - 1863
P9645    Krish   Kuri - P4557
P8516    Sati    Rao - 1863
P4568    Suri    Rao - 1863

我知道我们可以通过 SUBSTRING_INDEX,GROUP_CONCAT 获得它,但无法继续进行。我不知道如何进一步在单个 SQL 中获得所需的结果

4

2 回答 2

2

因为您的数据有点不一致并且混合了字符串和 ID,这让生活变得艰难,这是我可以解决的“最简单”的解决方案:

SELECT ChildID, Child, GROUP_CONCAT(IF(Matched > 0, CONCAT(empName, ' - ', empID), NULL))
FROM
(SELECT emp.empID, emp.empName, empcross.empID as `ChildID`, empcross.empName AS `Child`, 
       COALESCE(FIND_IN_SET(emp.empID, 
                    REPLACE(REPLACE(REPLACE(REPLACE(empcross.permissions, 'pr_', ''), 'rr_', ''), 'is_', ''), 'ir_', '')
                   ), FIND_IN_SET(emp.empID, 
                    REPLACE(REPLACE(REPLACE(REPLACE(empcross.permissions, 'pr_', ''), 'rr_', ''), 'is_', ''), 'ir_', '')
                   ), 0) AS `Matched`
FROM emp
LEFT JOIN emp as empcross ON emp.empID != empcross.empID) AS `Cross`
GROUP BY ChildID

注意我必须清除权限以使其与 FIND_IN_SET 一起使用,如果您的 MySQL 中有REGEX REPLACE支持,我建议将其用于更简洁的代码。

于 2013-07-01T10:46:30.467 回答
1

此表设计得不好,强烈建议不要将多个值放在一个字段中。它会降低数据库速度,并且您将难以维护,不必要的复杂查询。

您应该阅读一些有关数据库规范化的内容。

多值问题的示例解决方案:

PermissionId    empId    SuperiorId
1    1863     NULL
2    P4557    NULL
3    P4645    1863
4    P6682    P4557
5    P6682    1863

如您所见,P6682 有两条记录,一比一优越。然后您可以使用 JOIN 来检索您需要的信息。

于 2013-07-01T10:23:26.103 回答