2013-04-16 7 views
0

Учитывая таблицу пользователей с первичным ключом id, у меня есть внешняя таблица friends, которая имеет только два поля (userid1, userid2). Это позволяет нам создавать любые отношения между разными пользователями (от одного до многих, от одного до одного и т. Д.). Пользователь может отображаться в любом столбце, и оба столбца равны. IOW, одна запись для каждой связи.SQL найти записи на основе двух столбцов

Как я могу вытащить всех друзей, которые данный пользователь id имеет. Скажите, у Jonny, есть 3 знакомых и его пользователя id is 16 ... должен ли мой запрос sql выглядеть так?

SELECT * 
FROM db.users 
     JOIN db.friends 
     ON db.users.id = db.friends.userid1 
      AND db.users.id = 16 

Надеюсь, это ясно. Также, если возможно, могу ли я исключить Джонни из набора результатов?

Этот запрос, так как перечисленные ЭДД мне следующее:

id  name uuid      birthday  userid1 userid2 
16 jonny ABCDEFGHIJKLMNOP 1967-04-27 01:00:00  1   2 
16 jonny ABCDEFGHIJKLMNOP 1967-04-27 01:00:00  1   3 

Это довольно близко, за исключением того, я хочу его друзей, не Jonny


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

SELECT * 
FROM db.users 
WHERE db.users.id IN 
(
    SELECT db.friends.userid2 as id FROM db.friends WHERE db.friends.userid1 = 16 
    union 
    SELECT db.friends.userid1 as id FROM db.friends WHERE db.friends.userid2 = 16 
) 

, который дает мне:

id  name uuid      birthday 
2 robin ABCDEFGHIJKLMNOP 1967-04-27 01:00:00 
3 gary ABCDEFGHIJKLMNOP 1967-04-27 01:00:00 
+0

Выполнить запрос, предложили и сказали нам, соответствует ли результат вашим потребностям (а если нет, то каким образом это не удалось). – Oswald

+0

Друзья jonnies - пользователи с 'id' 2 и 3. Итак, у вас уже есть jonnies firends. В чем проблема? – Oswald

+0

Да. Друзья - это то, что мы хотим. Мне тоже не нужны два дополнительных столбца, но это нормально. –

ответ

1

Вы можете сделать запрос к югу, как:

SELECT * 
FROM users 
WHERE id IN 
(
    SELECT userid2 as id FROM db.friends WHERE userid1 = 16 
) 
+0

Это очень близко, если бы я мог заставить его работать в обоих направлениях, чтобы идентификатор пользователя мог находиться в любом столбце и все еще давать нам список, тогда я бы его получил. –

+0

Итак, просто выполните OR в подзапросе. "WHERE userid1 = 16 ИЛИ userid2 = 16" – CMR

1

Добавить условие для user.id к вашей статье where в конце:

Select * From users 
INNER JOIN friends on 
users.id = friends.userid1 
Where users.id = 16 

Кроме того, я хотел бы использовать Inner Join который будет возвращать все записи из users только в том случае, если есть матч в friends

+0

В MySQL простое слово 'JOIN' подразумевает' INNER JOIN'. –

+0

Условие 'users.id = 16' также может быть частью предложения' ON', как в запросе, предложенном OP. – Oswald

+0

@MichaelBerkowski Я просто детализировал свой ответ, не предполагая, что они были разными –

1

Вы должны фильтровать на стол друзей, а не таблица пользователей.

SELECT friends.* 
FROM friends 
INNER JOIN users 
    ON friends.userid2 = users.id 
WHERE friends.userid1 = 16 

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

SELECT userid2 
FROM friends 
WHERE userid1 = 16 
+0

Идентификатор целевой цели может быть в любом столбце. IOW, jonny может находиться в столбце 1 или столбце 2. –

+0

Итак, вы не добавляете двустороннюю связь в эту таблицу? I. Когда пользователь 1 пользователь-пользователь 100 там записаны две записи '1 | 100' и' 100 | 1'? Это затруднит вам жизнь, когда дело доходит до запроса, так как вы действительно не определили столбец пользователя и столбец друзей. Вы, вероятно, собираетесь заставить себя делать подвыборы или объединять результаты двух запросов. –

+0

Нет, если я сделаю это правильно, будет только одна запись. Должен ли я сделать два? –

1

Вам нужен список друзей Идентификаторы:

SELECT U FROM DB.USERS U WHERE U.ID IN (SELECT F.USERID2 FROM DB.FRIENDS F WHERE F.USERID1 = 16)

+0

OP не хочет, чтобы в соответствии с его вопросом «Как я могу вытащить всех друзей, которые имеют данный идентификатор пользователя». – Oswald

+0

Я считал, что либо связь двунаправленная, либо требует исходящих отношений. –

+0

Ах, да, теперь, когда я обновил страницу и увидел результаты, я понимаю его требования! –

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