如何使用MySql从相关表中获取用户的详细信息?

时间:2019-08-15 00:51:17

标签: mysql sql

我有3个看起来像这样的表:

用户

id | name | password 
------------------------
2  | John | ******
3  | Ben  | ******
4  | Dan  | ******

UserHobbies

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

如您所见-我得到每个嗜好者的人数-而不是与用户和嗜好者排成一行

2 个答案:

答案 0 :(得分:1)

要仅获取具有多个用户的兴趣爱好,请加入一个子查询,该子查询计算每个兴趣爱好的用户数。

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

答案 1 :(得分:0)

也可以使用WHERE:http://sqlfiddle.com/#!9/241cfd/4/0

数据

create table users (id INT, name VARCHAR(20), password VARCHAR(20));
create table user_hobbies (id INT, user_id INT, hobby_id INT);
create table hobbies (id INT, name VARCHAR(20));

INSERT INTO users VALUES (2, 'John', '**********');
INSERT INTO users VALUES (3, 'Ben', '**********');
INSERT INTO users VALUES (4, 'Dan', '**********');

INSERT INTO user_hobbies VALUES (1, 2, 1);
INSERT INTO user_hobbies VALUES (2, 2, 3);
INSERT INTO user_hobbies VALUES (3, 3, 1);
INSERT INTO user_hobbies VALUES (4, 4, 2);

INSERT INTO hobbies VALUES (1, 'Surfing');
INSERT INTO hobbies VALUES (2, 'Walking');
INSERT INTO hobbies VALUES (3, 'Soccer');

SQL

SELECT u.name, h.name AS hobby, uh.hobby_id
FROM user_hobbies AS uh
INNER JOIN users AS u ON uh.user_id = u.id
INNER JOIN hobbies AS h ON h.id = uh.hobby_id
WHERE uh.hobby_id = 1;

结果

| name |   hobby | hobby_id |
|------|---------|----------|
| John | Surfing |        1 |
|  Ben | Surfing |        1 |

希望有帮助。