我有两张桌子,第一张:
users(id,name, birth_date)
skills(user_id,skill_name,skill_level)
我想在第2级选择具有3项技能的所有用户。
它可以在一个查询中进行此操作吗?
示例:
user has
3,marcus,19/03/1989
4,anderson,08/02/1990
skills has
3,php,2
3,html,1
4,php,1
我想要的是:所有拥有php 2和html 1的用户。
答案 0 :(得分:5)
select *
from users u join skills s on u.id=s.user_id
where skill_level=2
group by id
having count(*)>2
答案 1 :(得分:1)
好。既然你已经更新了你的问题了,那么答案就变成了“是的,它可以完成,但你不应该这样做”。
首先,只是为了表明它可以完成:
SELECT u.* FROM users u
INNER JOIN skills s1 ON (u.id = s1.user_id AND s1.skill_name = 'php')
INNER JOIN skills s2 ON (u.id = s2.user_id AND s2.skill_name = 'html')
WHERE s1.skill_level = 2 AND s2.skill_level = 1 GROUP BY u.id;
如果你在开始时解释了你想要的东西,那么本来可以节省我很多的打字工作! :)
现在你应该做以上吗?它不是很漂亮,但原则是你为了不同的技能加入了两次表,使用别名(s1和s2)来隐藏它是同一个表的事实。有时这是正确的方法。麻烦的是,我怀疑你会有很多变化,你有时会发现不同级别的人有很多技能,有时只有一个,等等。您可能会发现编写代码以自动生成稍微复杂的查询,并且它不一定能很好地扩展。
您需要阅读数据库规范化以更好地设计表格。你还应该有技能表的id字段,然后你可以在需要时更容易地使用子查询。
答案 2 :(得分:0)
要检索HTML技能为1且PHP技能为2的用户列表:
SELECT u.name
FROM users u JOIN skills s1 ON u.id = s1.user_id AND s1.skill = 'php'
JOIN skills s2 ON u.ud = s2.user_id AND s2.skill = 'html'
WHERE s1.skill_level = 2
AND s2.skill_level = 1
如果您希望所有具有HTML和PHP的用户都可以完全删除WHERE子句。如果您希望所有PHP技能至少为2的用户,您只需将该子句更改为
即可s1.skill_level >= 2