У меня есть 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

Как видите, у пользователей Джона и Бена одно и то же хобби - «Серфинг», поэтому результат будет отображаться ТОЛЬКО с ними.

Вот что я сделал до сих пор -

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

Как вы можете видеть - я получаю счет каждого хобби - а не ряд с пользователем и хобби

0
RoyBarOn 15 Авг 2019 в 03:51

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
1
Barmar 15 Авг 2019 в 11:46

Также можно использовать ГДЕ: 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 |

Надеюсь, это поможет.

0
Twisty 15 Авг 2019 в 21:18