私よりも優れた人が、そこに到達するための SQL クエリの作成を支援できます。ただし、テーブルの外観では、有用な情報を引き出すために常に複雑なクエリを作成する必要があります。プロジェクトの初期段階にある場合は特に、テーブル構造を変更してクエリを簡単にすることをお勧めします。
たとえば、以下の表は、OP の情報を構造に反映しているため、作業がはるかに簡単になります。
tbl_users : 各ユーザーと 1 対 1 の関係を持つ詳細を保持します
userID|name|email...
u1 | x | ...
u2 | y | ...
u3 | z | ...
tbl_skills : 各スキルと 1 対 1 の関係を持つ詳細
skillID
s1
s2
s3
tbl_projects : 各プロジェクトと 1 対 1 の関係を持つ詳細
pID| title | deadline
p1 | project a | 2016-08-15
p2 | project b | 2017-01-01
p3 | project c | 2015-08-22
tbl_user_skills : 各レコードには 1 人のユーザーと 1 つのスキルがあり、どちらもこのテーブルの外部キーです (それぞれtbl_users
との主キーtbl_skills
)。エントリの重複を防ぐために、UNIQUE
インデックスをオンにする必要があります。(userID,skillID)
userID|skillID
u1 | s1
u1 | s2
u2 | s2
u2 | s3
u3 | s1
u3 | s3
tbl_project_skills各レコードには 1 つのプロジェクトと 1 つのスキルがあり、どちらもこのテーブルの外部キーです (それぞれtbl_project
との主キーtbl_skills
)。エントリの重複を防ぐために、UNIQUE
インデックスをオンにする必要があります。(pID,skillID)
pID|skillID
p1 |s2
p2 |s1
p2 |s3
p3 |s3
すべてがこのように編成されると、クエリははるかに高速かつ簡単に作成できるようになります。実際、ビットフラグの操作を理解していれば、これをかなり凝縮できます (例: ユーザーのすべてのスキルを 1 つのフィールドとして保持しますtbl_users
が、代わりにs1,s2
ビットを使用します)。
user のスキルを持つすべてのプロジェクトを取得するには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