Оператор SQL, который сначала упорядочивает выбранные идентификаторы с условием - PullRequest
2 голосов
/ 02 апреля 2012

У меня есть следующие таблицы:

team_members

userid
teamid

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

uid
name_f
name_l

друзья

friend_id
friend_one
friend_two

Я использую следующее утверждение, чтобы выбрать uid и profile_pic для пользователей, которые принадлежат к определенной команде .

SELECT DISTINCT u.uid, u.profile_pic
FROM friends f, users u, team_members m
WHERE m.teamid =$team_var
AND u.uid = m.userid

Мне также нужно выполнить следующее, чтобы выбрать uid и profile_pic для пользователей , которые дружат с вошедшим в систему пользователем и принадлежат к определенной команде .

SELECT DISTINCT u.uid, u.profile_pic
FROM friends f, users u, team_members m
WHERE m.teamid =$team_var
AND u.uid = m.userid
AND m.userid = f.friend_two
AND f.friend_one =$session_id

Я ищу способ объединить эти два и вместо того, чтобы выполнить 2 запроса, выполнить один запрос, который может упорядочить и перечислить пользователей, которые являются друзьями с вошедшим в систему пользователем.на вершине.Итак, допустим, что у определенной команды есть 30 пользователей, и 5 из этих пользователей являются друзьями с вошедшим в систему пользователем, я хотел бы, чтобы первые 5 были перечислены в цикле while после утверждения, чтобы быть теми из друзей с остальными25 показано случайным образом.

Спасибо за ваше время.

Ответы [ 3 ]

1 голос
/ 03 апреля 2012

Это можно легко решить с помощью внешнего соединения. Вы, вероятно, не сможете использовать внешнее соединение без явного синтаксиса соединения. Здесь:

SELECT
  u.uid,
  u.profile_pic,
  (friend_id IS NOT NULL) AS is_friend
FROM team_members m
  INNER JOIN users u ON m.userid = u.uid
  LEFT JOIN friends f ON m.userid = f.friend_two AND f.friend_one = $session_id
WHERE m.teamid = $team_var
ORDER BY
  is_friend DESC,
  m.userid

Первые две таблицы объединяются с использованием внутреннего объединения, поэтому возвращаются только члены определенной команды (поскольку мы фильтруем teamid).

Таблица friends внешне присоединяется к результату предыдущего объединения. Более конкретно, мы присоединяемся к подмножеству из friends, где friend_one - текущий пользователь. Возвращаются все строки из предыдущего набора результатов, но также и строки из подмножества friends возвращаются там, где сопоставлены. Там, где нет совпадения, столбцы friends заполнены NULL s.

Используя тест NULL (точнее NOT NULL), мы можем увидеть, какой член команды является другом, а кто нет. Результат теста возвращается в виде столбца, а также используется в качестве критерия сортировки для выходных строк.

0 голосов
/ 03 апреля 2012

Я мог бы предложить это:

select u.uid, u.profile_pic
from team_members t
    join team_members m on t.teamid = m.teamid
    join users u on m.userid = u.uid
    left join friends f on t.userid = f.friend_one and m.userid = f.friend_two
where m.userid != t.userid
    and t.userid = $session_id -- This line can be removed to view all (test)
order by
    --t.teamid, t.userid, -- This line can be added to order all (test)
    (case when f.friend_id is null then 1 else 0 end case),
    f.friend_id, m.userid

Я использую явный синтаксис объединения (который обычно рекомендуется в наши дни) и использую этот оператор case в порядке, чтобы получить друзей наверх. У меня не запущен MySQL, чтобы протестировать его, но синтаксис должен быть довольно стандартным (я использую что-то очень похожее на SQL Server).

0 голосов
/ 02 апреля 2012

Вам необходимо создать еще один столбец, который имеет значение «друг» или не «друг». Затем вы будете использовать этот столбец как ORDER BY. Созданный вами столбец может быть вложенным запросом, чтобы определить, является ли другой пользователь другом или нет. Следующий код неправильный, потому что вам нужно подключить данные из внешнего запроса в подзапрос, но он должен выглядеть примерно так:

SELECT DISTINCT u.uid, u.profile_pic,
EXISTS (SELECT DISTINCT u.uid, u.profile_pic 
FROM friends f, users u, team_members m 
WHERE m.teamid =$team_var 
AND u.uid = m.userid 
AND m.userid = f.friend_two 
AND f.friend_one =$session_id 
) AS myColumn 
FROM friends f, users u, team_members m 
WHERE m.teamid =$team_var 
AND u.uid = m.userid 
ORDER BY myColumn
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...