我正在用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中获得所需的结果
答案 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来检索所需的信息。