-1

我有两张桌子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:保存与每个用户具有一对一关系的详细信息

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_userstbl_skills)。它应该有一个UNIQUE索引(userID,skillID)以防止重复条目。

userID|skillID
 u1   | s1
 u1   | s2
 u2   | s2
 u2   | s3
 u3   | s1
 u3   | s3

tbl_project_skills每条记录有一个项目和一个技能,两者都是该表的外键(主键分别在tbl_projecttbl_skills中)。它应该有一个UNIQUE索引(pID,skillID)以防止重复条目。

pID|skillID
p1 |s2
p2 |s1
p2 |s3
p3 |s3

一旦一切都以这种方式组织起来,您的查询将更快、更简单地构建。实际上,如果您了解位标志操作,则可以大大简化这一点(例如:将用户的所有技能作为一个字段,tbl_userss1,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
于 2016-08-03T12:02:45.280 回答