2012-01-12 3 views
1

У меня возникли проблемы с вычислением инструкции SQL, которую мне нужно сделать.MySQL - сложная проблема запроса, несколько таблиц

У меня есть 2 таблицы

Друзья

=================================== 
friendfromid | friendtoid | request 
=================================== 

пользователей

================= 
userid | username 
================= 

Мне нужно, чтобы получить идентификатор пользователя и имя каждого пользователя, который является моим другом.

Мой идентификатор находится либо в friendfromid, либо в friendtoid в зависимости от того, запрашивается ли пользователь или пользователь запросил меня.

Так что, в основном, нужно, чтобы скрипт должен был посмотреть таблицу друзей, получить все строки, в которых мой id либо friendfromid, либо friendtoid, проверить, что поле запроса установлено в 1, взять все строки, которые соответствуют этому затем получите идентификаторы и имена пользователей каждого friendfromid или friendtoid, который не является моим.

Например, если мой идентификатор был 8, а id друзей - 9, допустим, что они запросили меня, что их идентификатор будет в поле friendfromid, а мой идентификатор будет в поле friendtoid, это означает, что скрипт будет принимать свой идентификатор (9) и сопоставить его с этим пользователем в таблице users.

ответ

2

Это даст список друзей с другим ид и друг Именем:

SELECT u.userid , u.username 
FROM Friends f 
JOIN Users u 
ON ((f.friendfromid ={the ID} AND friendtoid=u.userid) 
OR (f.friendtoid = {the ID} AND friendfromid=u.userid)) 
WHERE f.request = 1 

Put {идентификатор} = идентификатор пользователя, чей список друзей требуются.

+0

Я думаю, вы имеете в виду '(friendfromid =? AND friendtoid = userid) ИЛИ (friendtoid =? AND friendfromid = userid) '. –

+0

есть.? означает список друзей. –

+0

Что я имею в виду, когда 'fromid' соответствует' toid' - это внешний ключ и наоборот. Все условия соединения эквивалентны '{ID} = userid'! –

1

Должно быть что-то вроде этого:

SELECT * 
FROM users 
JOIN friends 
ON friendfromid != userid 
OR friendtoid != userid 
WHERE request = 1 
    AND userid = {the ID} 
+0

Неправильно. Он хочет получить идентификатор из «friendfromid» или «friendtoid», где его идентификатор пользователя находится в противоположном поле. – Raptor

1

Не удается достичь в 1 запрос.

Чтобы получить friendtoid с "мой идентификатор пользователя" в friendfromid поле:

SELECT b.friendtoid FROM Users a, Friends b WHERE request=1 AND friendfromid = a.userid 

НАОБОРОТ для friendfromid.

+0

Извините, это не имеет смысла .... Мне нужно получить имя пользователя и пользователя из таблицы users – BigJobbies

1

Использовать запрос UNION, присоединившись к друзьям, как показано ниже

SELECT username FROM user INNER JOIN friends ON (userid = friendfrom) WHERE friendto = {myid) AND request = 1 
UNION 
SELECT username FROM user INNER JOIN friends ON (userid = friendto) WHERE friendfrom = {myid} AND request = 1 

Помните, что вам нужно индексы в friendto и friendfrom столбцов для выполнения

Смежные вопросы