2013-07-01 2 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

Поскольку ваши данные немного непоследовательны и смешивают обе строку и идентификаторы, это делает жизнь трудно, это «Простейшее» решение, которое я мог бы работать:

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, если у вас есть REGEX REPLACE поддержка в вашем MySQL. Я предлагаю использовать его для более чистого кода.

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

Да, моя цель - способствовать изменению дизайна _if possible_. – mtt

+0

Хорошо, что ваш дизайн также ошибочен ... если он собирается нормализовать, он должен использовать две таблицы, одну для сотрудников, а другую для отношения nm между рабочими и начальниками ... –