比我更优秀的人可以帮助您构建 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
一旦一切都以这种方式组织起来,您的查询将更快、更简单地构建。实际上,如果您了解位标志操作,则可以大大简化这一点(例如:将用户的所有技能作为一个字段,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