mysql - 如何使用 MySql 从相关表中获取用户的详细信息?
问题描述
我有 3 个如下所示的表:
用户
id | name | password
------------------------
2 | John | ******
3 | Ben | ******
4 | Dan | ******
用户爱好
id | user_id | hobbie_id
-------------------------
1 | 2 | 1
2 | 2 | 3
3 | 3 | 1
4 | 4 | 2
爱好
id | HobbieName
------------------------
1 | Surfing
2 | Walking
3 | Soccer
我想找到用户的相关爱好,所以结果将如下所示:
username | HobbieName | hobbie_id
------------------------
John | Surfing | 1
Ben | Surfing | 1
如您所见 - 用户 John 和 Ben 有相同的爱好 - “冲浪”,因此结果将仅显示他们。
这是我到目前为止所做的 -
SELECT users.name, hobbies.hobbie_name, COUNT(user_hobbies.hobby_id) FROM
user_hobbies
INNER JOIN users on user_hobbies.user_id = users.id
INNER JOIN hobbies ON hobbies.id = user_hobbies.hobby_id
GROUP BY user_hobbies.hobby_id
结果:
name | hobbie_name | count
---------------------------
dan | Surfing | 2
如您所见-我得到了每个爱好的计数-而不是与用户和爱好一起排
解决方案
要仅获取具有多个用户的爱好,请加入一个计算每个爱好的用户数的子查询。
SELECT users.name, hobbies.hobbie_name, user_hobbies.hobby_id
FROM user_hobbies
INNER JOIN users on user_hobbies.user_id = users.id
INNER JOIN hobbies ON hobbies.id = user_hobbies.hobby_id
INNER JOIN (
SELECT hobby_id
FROM user_hobbies
GROUP BY hobby_id
HAVING COUNT(*) > 1
) AS multiple ON multiple.hobby_id = user_hobbies.hobby_id
推荐阅读
- css - 响应式水平时间线 - Boostrap 4
- python - 如何检查两个三维numpy数组是否相同?
- python - 在 Pycharm 中,即使在我编辑代码并重新运行算法之后,如何保留我以前的运行结果?
- cakephp - 初始化蛋糕项目
- angular - 如何使用 TypeScript 函数在正文中动态添加组件
- python - 如何在 tkinter 中获取标签的当前宽度
- javascript - Accordion - 切换时更改背景颜色/图像:
- swift - 在应用程序委托中识别和加载视图控制器时出现“使用未解析的标识符‘rootViewController’”错误
- .htaccess - .htaccess 500 内部错误,即使规则正确
- pandas - 根据其中一列中的子字符串删除数据框的行