在复杂的MySQL查询中需要帮助

时间:2013-07-01 10:11:35

标签: mysql mysql-python

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

我有一张包含员工详细信息的表(id,empID,名称,权限) 权限将包含逗号分隔数据和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中获得所需的结果

2 个答案:

答案 0 :(得分: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

注意如果您的 REGEX REPLACE 支持,我必须清除权限以使其与FIND_IN_SET一起使用MySQL我建议使用它来获得更清晰的代码。

答案 1 :(得分:1)

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

您应该阅读一下Database normalization

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

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

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