-1

私は2つのテーブルを持っていてtbl_usertbl_projects

tbl_user
+-----+------+--------+
| id  | name | skills |
+-----+------+--------+
|  u1 | x    | s1,s2  |
|  u2 | y    | s2,s3  |
|  u3 | z    | s3,s1  |
+-----+------+--------+

tbl_projects
+-----+--------+
| id  | kills  |
+-----+--------+
|  p1 | s2     |
|  p2 | s1,s3  |
|  p3 | s3     |
+-----+--------+

私のアプリケーションでは、ユーザースキルと一致するすべてのプロジェクトを一覧表示するためのSQLクエリが必要です

例、ユーザーu1を選択すると、結果は次のようになります

+-----+--------+
| id  | kills  |
+-----+--------+
|  p1 | s2     |
|  p2 | s1,s3  |
+-----+--------+
4

1 に答える 1

1

私よりも優れた人が、そこに到達するための 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
于 2016-08-03T12:02:45.280 に答える