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

このテーブルは適切に設計されていません。1 つのフィールドに複数の値を入力することは強くお勧めしません。データベースの速度が低下し、メンテナンスが難しく、不要で複雑なクエリが必要になります。

データベースの正規化について少し読む必要があります。

複数の値の問題に関するサンプル ソリューション:

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

ご覧のとおり、P6682 には、上位 1 人につき 1 人の 2 つのレコードがあります。次に、JOIN を使用して必要な情報を取得できます。

于 2013-07-01T10:23:26.103 に答える