Люди лучше, чем я могу помочь вам построить SQL-запрос, чтобы доставить вас туда. Как выглядят ваши таблицы, вам всегда придется создавать сложные запросы, чтобы извлекать полезную информацию. Мой совет, особенно если вы еще на ранней стадии своего проекта, состоит в том, чтобы изменить структуру таблицы, чтобы упростить запрос.
Например, приведенные ниже таблицы отражают информацию в вашем OP в структуре, которая сделает вашу жизнь намного проще.
tbl_users: содержит детали, которые имеют отношение один к одному с каждого пользователя
userID|name|email...
u1 | x | ...
u2 | y | ...
u3 | z | ...
tbl_skills: детали, которые имеют отношение один к одному с каждого навыка
skillID
s1
s2
s3
tbl_projects: подробности, имеющие взаимно-однозначные отношения с каждым проектом
pID| title | deadline
p1 | project a | 2016-08-15
p2 | project b | 2017-01-01
p3 | project c | 2015-08-22
tbl_user_skills: Каждая запись имеет один пользователь и один навык, оба из которых являются внешними ключами к этой таблице (первичные ключи в tbl_users
и tbl_skills
соответственно). Он должен иметь индекс UNIQUE
на (userID,skillID)
, чтобы предотвратить дублирование записей.
userID|skillID
u1 | s1
u1 | s2
u2 | s2
u2 | s3
u3 | s1
u3 | s3
tbl_project_skills Каждая запись имеет один проект и один навык, оба из которых являются внешние ключи к этой таблице (первичные ключи в tbl_project
и tbl_skills
соответственно). Он должен иметь индекс UNIQUE
на (pID,skillID)
, чтобы предотвратить дублирование записей.
pID|skillID
p1 |s2
p2 |s1
p2 |s3
p3 |s3
Как только все организовано таким образом, ваши запросы будут намного быстрее и намного проще в сборке. На самом деле, если вы понимаете операции битфлага, вы можете скомпенсировать это значительно (например: иметь все навыки у пользователя как одно поле в tbl_users
, но вместо s1,s2
вы будете использовать бит).
Чтобы получить все проекты с навыками пользователя u1
:
SELECT p.pID, p.title
FROM tbl_projects p
LEFT JOIN tbl_project_skills ps ON p.pID = ps.pID
LEFT JOIN tbl_user_skills us ON ps.skillID = us.skillID
WHERE us.userID='u1'
GROUP BY p.pID
Результат
pID| title
p1 | project a
p2 | project b
Архитектура неправильно для согласования, Вам необходимо нормализовать 'skills' в другой таблице и имеют ассоциацию с 'user' и' project'. Таким образом, это будет легко фильтровать. – Jeet