2014-12-05 8 views
0

Я создаю сайт сообщества, на котором я добавил функциональность добавления людей в качестве друзей.Отображение друзей из списка друзей

Теперь мои друзья таблица выглядит следующим образом

+----+---------+-------+ 
| id | ppl_1 | ppl_2 | 
+----+---------+-------+ 
| 1 | 5 | 7 | 
| 2 | 13 | 5 | 
+----+---------+-------+ 

id is simply the autoincrement field. 
ppl_1 is one user's id 
ppl_2 is another user's id 

Теперь рассмотрим Я пользователь, идентификатор 5. Я хочу видеть мой список друзей. Как я могу работать, потому что мой идентификатор может быть где угодно между ppl_1 или ppl_2. Так что я должен запустить 2 запроса для проверки? Это будет плохо, я думаю, учитывая производительность сайта. Или мне нужно что-то делать в одном запросе, чтобы проверить оба пути?

Учитывая $me = $_SESSION['id'] ;

Любой показать мне какой-то свет здесь?

+1

Используя 'UNION', вы можете сделать 2 запроса в одном, где 1-й выбирает друзей в' ppl_1', а второй - друзей в 'ppl_2', т.е. 'SELECT ppl_1 как друг ... UNION ... SELECT ppl_2 как друг ...' – Sean

+2

эта проблема была решена много раз. [sql-join-help-for-friend-list] (http://stackoverflow.com/questions/2203513/sql-join-help-for-friend-list) [как-представить -симметричный-много- -many-relationship] (http://stackoverflow.com/questions/3550093/how-to-represent-symmetric-many-to-many-relationship) [how-should-i-design-a-relationship-table-for -дружество] (http://dba.stackexchange.com/questions/10199/how-should-i-design-a-relationship-table-for-friendship) – abl

ответ

0

Это поможет вам, если вы переименуете столбцы ppl_1 и ppl_2 в своей таблице, чтобы лучше отразить их фактическое значение.

Вы могли бы назвать их что-то вроде 'друга' и 'befriended_by'

Тогда вы бы выполнить объединение:

SELECT befriended_by 
FROM user 
INNER JOIN [name of your table above] 
ON user.id = friend 
WHERE user.id = [:id, please use parameterised queries to insert your $_SESSION['id'] here or some other sane method to prevent sql injection attacks ] 

Вот так.

+0

Что делать, если в одной строке 'befriended_by' содержится мой идентификатор и другой «друг друга» содержит мой идентификатор? Как я уже говорил. Мой идентификатор может находиться в любом из столбцов на всем протяжении пути до нижней части таблицы. Я не хочу выбирать свой идентификатор и выбирать идентификатор другого человека. –

+0

Привет, Sagnik, все в порядке. Каждый столбец имеет другую функцию; если вы хотите получить список своих друзей, вас интересуют значения в столбце 'friends' для строк, где' befriended_by' - ваш идентификатор. Если вы хотите узнать, кто добавил вас в список своих друзей, вас интересуют значения в столбце 'befriended_by', где' friends' - ваш идентификатор. Проверьте вопрос, указанный abl, это может помочь вам прояснить концепцию. –