2013-09-10 2 views
0
SELECT 
    FRIEND.friend_two AS possible_friend, USERS.username AS possible_username 
FROM 
    user_friends FRIEND, users USERS 
WHERE 
    FRIEND.friend_one IN (SELECT friend_two FROM user_friends WHERE friend_one = :id) 
    AND FRIEND.friend_two NOT IN (SELECT friend_two FROM user_friends WHERE friend_one = :id) 
    AND NOT FRIEND.friend_two = :id 
GROUP BY possible_friend 

пользователейMySQL QUERY: JOIN несколько таблиц с ORDER BY

+------------+------------------+ 
|  id  |  username  | 
+------------+------------------+ 
|  10  |  Josh  | 
+------------+------------------+ 
|  20  |  Steward  | 
+------------+------------------+ 
|  30  |  Fenton  | 
+------------+------------------+ 

user_friends

+------------+------------+------------+------------+ 
| friend_id | friend_one | friend_two | Role | 
+------------+------------+------------+------------+ 
| ramdom_id |  10  |  10  |  me  + 
+------------+------------+------------+------------+ 
| ramdom_id |  20  |  20  |  me  + 
+------------+------------+------------+------------+ 
| ramdom_id |  10  |  20  | friend + 
+------------+------------+------------+------------+ 
| ramdom_id |  20  |  30  | friend + 
+------------+------------+------------+------------+ 

friend_one = 10 (Josh)  -> follows -> friend_two = 20 (Steward) 
friend_one = 20 (Steward) -> follows -> friend_two = 30 (Fenton) 

var_dump ($ запроса); отображает следующий текст.

Array ([possible_friend] => 30 [possible_username] => STEWARD) 

Ошибка в var_dump является то, что я уже следуют Стюард и Стюард имеет идентификатор (20). То, что я хотел бы показать,

Array ([possible_friend] => 30 [possible_username] => FENTON) 

С Фентон имеет идентификатор (30) и Josh(10), который регистрируется в не следует Фентона.

Если Josh(10) авторизован, он будет предложить JOSH следовать Fenton(30) поскольку Steward(20) следует Fenton(30) пока Josh(10) нет.

Когда этот запрос приходит к закрытию, цель состоит в том, чтобы предложить Друзьям моих друзей, чтобы пользователь мог следовать, как объяснялось выше.

Как использовать GROUP BY, чтобы убедиться, что пользователь, которому предлагается, имеет правильное имя пользователя, которое будет напечатано, как я объяснил с помощью var_dump для FENTON. С момента, когда он извлекает случайные имена пользователей, которые я уже наблюдаю, а не «AS possible_friends» в запросе.


+0

О, боже мой, думаю, я начал видеть, что звезды читают это. Можете ли вы добавить редактирование, объясняющее, что вы хотите, в простом английском. Не беспокойтесь о коде или структуре - я думаю, что это помутнение ответа. На основе ваших пользователей и таблицы user_friends, что вы хотите сделать? если я это понимаю, что-то предложить друзьям на основе друзей других друзей? – Fluffeh

+0

Я хотел бы сделать точно так же, как предложение друга Twitter, делает ли это достаточно простым или я должен дать лучшее объяснение? – iBrazilian

+1

В вашем посте ничего не говорится о 'UNION'. Вы имели в виду 'JOIN'? –

ответ

1

Проблема заключается в том, что ничего в вашем запросе на самом деле не накладывает никаких ограничений на USERS строк, которые будут возвращены, поэтому вы присоединяетесь каждую соответствующую строку USER_FRIENDS до всех строк из USERS, а затем оставить его GROUP BY, чтобы выбрать один произвольно.

Лучшее исправление, чтобы изменить это:

FROM 
    user_friends FRIEND, users USERS 

к этому:

FROM user_friends friend 
JOIN users 
    ON users.id = friend.friend_two 

, чтобы указать, что вы специально искали для ряда USERS которого id соответствует friend_two соответствующего USER_FRIENDS ряд.

+0

Благодарим вас за помощь. Я провожу несколько часов, пытаясь присоединиться и не работаю. – iBrazilian

+0

@iBrazilian: Добро пожаловать! – ruakh

0

Вот еще один подход можно рассмотреть:

SELECT FRIEND_NAME.username, P_FRIEND_NAME.username 
FROM user_friends FRIENDS 
INNER JOIN user_friends P_FRIENDS on FRIENDS.friend_one = P_FRIENDS.friend_two 
INNER JOIN users FRIEND_NAME on FRIENDS.friend_two = FRIEND_NAME.id 
INNER JOIN users P_FRIEND_NAME on P_FRIENDS.friend_one = P_FRIEND_NAME.id 
WHERE FRIENDS.friend_one <> P_FRIENDS.friend_one 
and FRIENDS.friend_two <> P_FRIENDS.friend_two 

Результаты: Фентон | Josh