SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 04.05.2011 02:12:07

vladislav
Участник
Зарегистрирован: 26.10.2010
Сообщений: 17

Помогите с реализацией связи М-ко-М для записей из одной таблицы

Есть таблица users:

id | name
--+------
1 | vasya
2 | petya
3 | sasha
4 | masha
5 | ivan

Требуется организовать связь многие ко многим для строк из этой таблицы. (друзья Васи: Петя и Маша и т.д.)

для этого сделал таблицу связей users2users:

id | user_id_1 | user_id_2
--+----------+----------
1 | 1            | 2
2 | 1            | 4
3 | 3            | 2
4 | 2            | 5

Задача: выбрать всех друзей Пети?
Что-то не пойму как построить запрос. Неужели придется сохранять все связи дважды (прямая и обратная) ?

Как правильно реализовать такую связь? И как правильно построить запрос? Помогите пожалуйста неопытному smile

Неактивен

 

#2 04.05.2011 02:53:01

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите с реализацией связи М-ко-М для записей из одной таблицы

Проще всего, конечно, хранить связи дважды. Ну то есть можно
написать запрос WHERE user_id_1 = ... OR user_id_2 = ..., наверное,
он тоже будет неплохо работать smile

Неактивен

 

#3 04.05.2011 21:44:46

vladislav
Участник
Зарегистрирован: 26.10.2010
Сообщений: 17

Re: Помогите с реализацией связи М-ко-М для записей из одной таблицы

Если хранить связи дважды, то запрос получается простенький:

SELECT u.id, u.name
FROM users u
JOIN users2users u2u ON u.id = u2u.user_id_2
WHERE u2u.user_id_1 = 2


А вот если связи дважды не хранить, то запрос составить у меня не получается sad
Как же все таки решается такая задача? Помогите пожалуйста.

Неактивен

 

#4 04.05.2011 23:03:55

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите с реализацией связи М-ко-М для записей из одной таблицы

SELECT user_id_2 FROM users2users WHERE user_id_1 = 2
UNION
SELECT user_id_1 FROM users2users WHERE user_id_2 = 2

Ну и JOIN, соответственно, или в каждую часть UNION, или снаружи подзапросом.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson