我有两张表tbl_user
和tbl_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 |
+-----+--------+
答案 0 :(得分: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_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
一旦以这种方式组织了所有内容,您的查询将更快,更简单。事实上,如果你理解了bitflag操作,你可以大大缩小它(例如:将用户的所有技能作为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