У меня есть 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
Как вы можете видеть - я получаю счет каждого хобби - а не ряд с пользователем и хобби
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
Также можно использовать ГДЕ: 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 |
Надеюсь, это поможет.
Похожие вопросы
Новые вопросы
mysql
MySQL — это бесплатная система управления реляционными базами данных (RDBMS) с открытым исходным кодом, которая использует язык структурированных запросов (SQL). НЕ ИСПОЛЬЗУЙТЕ этот тег для других БД, таких как SQL Server, SQLite и т. д. Это разные БД, которые используют свои собственные диалекты SQL для управления данными. В вопросе всегда указывайте точную версию сервера. Версии 5.x сильно отличаются по своим возможностям от версий 8+.