使用FIND_IN_SET和数组进行查询

时间:2016-08-03 11:40:33

标签: php mysql sql find-in-set

我有两张表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  |
+-----+--------+

1 个答案:

答案 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_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

一旦以这种方式组织了所有内容,您的查询将更快,更简单。事实上,如果你理解了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