2014-02-20 2 views
1

У меня есть таблица (BUDDY) с этими атрибутамиSQL запрос не получить это право

  • идентификатор
  • запрашивающий
  • просил
  • статус

если статус = 'а 'означает, что запросчик и запрос являются друзьями , однако как я могу узнать приятелей определенного пользователя, если пользователь может либо быть запрашивающим, либо запросить STED?

SELECT requestor, requested 
FROM buddy,user 
WHERE user_id = requestor or user_id = requested 

Это дает мне несколько значений?

ответ

2

Если вы хотите получить от пользователя поле, необходимо добавить buddy в таблицу user. В противном случае вы получите некоррелированное перекрестное соединение.

Однако, это не выглядит, как вам нужно любой из столбцов пользователя, так что простое изменение ниже, следует сделать трюк:

SELECT requestor, requested 
FROM buddy 
WHERE user_id = requestor or user_id = requested 

Если вы хотите добавить поля от пользователя, добавьте присоединиться:

SELECT b.requestor, b.requested, u.first_name, u.last_name 
FROM buddy b 
JOIN user u ON b.requestor=u.id OR b.requested=u.id 
WHERE user_id = b.requestor or user_id = b.requested 
+0

спасибо! это очень помогло мне! @dasblinkenlight – Nhiz

0

Учитывая пользователь U

SELECT requestor 
FROM buddy 
WHERE requested = U AND status='a' 
UNION 
SELECT requested 
FROM buddy 
WHERE requestor = U AND status='a' 
0

Как о следующем:

SELECT b.requested AS MyBuddy 
FROM buddy AS b 
INNER JOIN user AS u1 u1.user_id = b.requestor 
WHERE buddy.status = 'a' 
AND u1.user_id = 101 

UNION 

SELECT b.requestor AS MyBuddy 
FROM buddy AS b 
INNER JOIN user AS u2 u2.user_id = b.requested 
WHERE buddy.status = 'a' 
AND u2.user_id = 101 

Первый запрос выполняет поиск requestor пользователя в вопросе и если состояние a то тянет requested как MyBuddy. Второй запрос выполняет поиск requested для данного пользователя, и если статус a, то он тянет requested как MyBuddy. Затем вы объединяете два запроса вместе, чтобы получить полный список.

Я присоединился к user столу, потому что, вероятно, вы хотите использовать что-то вроде u1.name вместо b.requested и b.requestor в SELECT.

0

Просто присоединиться к user для обоих условий:

SELECT requestor, requested, u.user_name AS Buddy 
FROM buddy b 
INNER JOIN user u 
    ON (@userID = requestor AND b.requested = u.user_id) 
    OR (@userID = requested AND b.requestor = u.user_id) 
WHERE status = 'a' 
Смежные вопросы