MySQL关系查询

时间:2011-06-29 14:10:38

标签: php mysql inner-join

我有两张桌子,第一张:

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的用户。

3 个答案:

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