Как я могу получить своих друзей друзей, используя MySQL и PHP - PullRequest
2 голосов
/ 05 октября 2009

В настоящее время мне нужно найти друзей в моем приложении, используя PHP и MYSQL

Например: Структура базы данных такая. Название таблицы: tbl_friendlist

Ident   mem_id  friend_id
1         2        1
2         1        2
3         1        3
1         4        1
5         1        8

Как мне этого добиться

Я могу получить друзей по

SELECT * FROM tbl_friendlist WHERE mem_id = 1.

Используя это, я могу получить список моих друзей. Теперь, как я могу получить друзей друзей

Ответы [ 6 ]

4 голосов
/ 05 октября 2009

я бы тоже сделал подзапрос (мой SQL действительно ржавый, но запрос будет выглядеть примерно так)

SELECT * from tbl_friendlist where mem_id in (SELECT friend_id FROM tbl_friendlist WHERE mem_id = 1).
4 голосов
/ 05 октября 2009

Итак, разбиваясь на шаги - вы хотите найти всех своих друзей, а затем вы хотите найти всех своих друзей. Это две части вашего запроса (и подзапроса):

Так вы получите список всех своих друзей

SELECT friend_id
FROM tbl_friendlist
WHERE f.mem_id = 1

И тогда вы просто оборачиваете это во вторую часть:

SELECT f.friend_id
FROM tbl_friendlist f
WHERE f.mem_id IN (
    SELECT f2.friend_id
    FROM tbl_friendlist f2
    WHERE f2.mem_id = 1
)

Вы также можете добавить туда несколько дополнительных фильтров, например:

SELECT DISTINCT f.friend_id
FROM tbl_friendlist f
WHERE f.mem_id IN (
    SELECT f2.friend_id
    FROM tbl_friendlist f2
    WHERE f2.mem_id = 1
) AND f.friend_id <> 1

Это означает, что вы не получите дубликаты и окажетесь в списке друзей друзей.

3 голосов
/ 05 октября 2009

Решение от nickf будет работать хорошо, но я бы лично сделал это за JOIN:

SELECT
    DISTINCT fof.friend_id
FROM
    tbl_friendlist f
    JOIN tbl_friendlist fof ON fof.mem_id=f.friend_id
WHERE
    f.mem_id = 1 AND fof.friend_id != 1;
3 голосов
/ 05 октября 2009

Если вам нужно найти способ без подзапросов, вы можете попытаться сделать это, присоединившись к самой таблице ON.

идея, не проверенная:

SELECT a.mem_id, b.mem_id AS secundaryfriends FROM tbl_friendlist AS a
JOIN tbl_friendlist AS b ON a.friend_id = mem_id;
2 голосов
/ 05 октября 2009

Хм, думаю что-то подобное может сработать:

SELECT 
   f1.friend_id, group_concat( f2.friend_id ) as f_of_f
FROM 
   tbl_friendlist f1
   LEFT JOIN 
   tbl_friendlist f2 ON ( f1.friend_id = f2.mem_id )
WHERE 
   f1.mem_id = 1
GROUP BY 
   f2.mem_id

Это даст вам идентификаторы друзей друзей в виде отдельного запятой в столбце f_of_f.

0 голосов
/ 08 декабря 2012

и друзья друзей друзей:

SELECT
    DISTINCT fof.friend_id
FROM
    tbl_friendlist f
    JOIN tbl_friendlist fof ON fof.mem_id=f.friend_id
    JOIN tbl_friendlist fofof ON fofof.mem_id=fof.friend_id
WHERE
    f.mem_id = 1 AND fof.friend_id != 1;

это правильно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...