2013-07-01 46 views
0

我正在使用Python,PyQt4和MySQL開發應用程序。在複雜的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

因爲你的數據是有點不一致和混合字符串和標識,它使生活困難,這就是「simpliest」解決方案,我可以工作了:

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支持,我建議使用它來獲得更簡潔的代碼。

1

此表格設計不好,強烈建議不要在一個字段中放置多個值。它會降低數據庫的速度,並且你將難以維護,不必要的複雜查詢。

您應該瞭解一下Database normalization

多個值問題的樣品溶液:

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

正如你可以看到,P6682有兩個記錄,每一個優越的一個。然後你可以使用JOIN來檢索你需要的信息。

+0

他必須與他擁有的一起工作,你不能責怪數據庫設計......他可能沒有選擇更改數據庫設計。 –

+0

是的,我的目標是鼓勵更改設計_ifif possible_。 – mtt

+0

那麼你的設計也是錯誤的......如果他要做正常化,他必須使用兩張桌子,一個給僱員,另一個爲僱員和上司之間的nm關係...... –