У меня есть таблица с именем users, которая выглядит, например, так:

Таблица: пользователи

username id 
Simon     6
Ida       7

И таблица отношений

Table: Relationships

me partner
 6       7

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

Если Ида отправляет запрос Саймону, столбец выглядит следующим образом: я: 7 партнер: 6, потому что Ида - это идентификатор 7, а Саймон - номер 6.

Но если Саймон отправляет запрос, то столбцы выглядят так: я: 6 партнер: 7

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

Моя проблема в том, что столбцы «Я» и «Партнер» могут иметь разные значения в зависимости от того, какой из двух пользователей отправил запрос первым.

Как мне написать запрос, который выводит на печать правильную информацию для каждого пользователя и дает им правильный идентификатор их партнера?

Как должен выглядеть результат:

  • С точки зрения Саймона * : Вы состоите в отношениях с Идой.

  • С точки зрения Идаса * : Вы состоите в отношениях с Саймоном.

0
Eymen 25 Фев 2016 в 21:05

3 ответа

Лучший ответ

Хочу предложить альтернативу.

Присоедините пользовательскую таблицу к таблице отношений либо в столбце me, либо в столбце partner.

Затем присоедините таблицу пользователей обратно к таблице отношений, используя те же критерии.

SELECT u.username, 
FROM users u
JOIN relationships r ON u.id = r.me OR u.id = r.partner
JOIN users u2 ON r.me = u2.id OR r.partner = u2.id
WHERE u.id = 'THE USER YOU CARE ABOUT'

Не проверено. Если вы подбросите несколько CREATE TABLE и INSERT INTO, мы все сможем сыграть.

0
Adrian Lynch 25 Фев 2016 в 18:37

Если вы хотите получить всех пользователей, которые связаны с каким-либо пользователем (например: id: 2), который вы указали, я бы использовал что-то вроде этого:

SELECT id, username
FROM user, 
    (SELECT receiver_id as rel_id FROM relationship WHERE sender_id=2 union
     SELECT sender_id as rel_id FROM relationship WHERE receiver_id=2) tab
WHERE id=rel_id

Внутренний оператор означает, что вы выбираете все отношения, в которых 2 был отправителем, и все отношения, в которых 2 был получателем, и складываете их в один столбец (объединение).

После этого пользователь таблицы используется для получения имени пользователя из идентификатора.

0
Edu 25 Фев 2016 в 18:29
Select username as username, 
    (select username name from users uSubq where uSubq.id = r.partner) as partnername 
    from users u join relationships r on u.id=r.me 
UNION
Select username as username, 
    (select username name from users uSubq where uSubq.id = r.me) as partnername 
    from users u join relationships r on u.id=r.partner;

Вот тест для запроса: Sql Fiddle

Если Ида отправила запрос Саймону или наоборот, но не оба, используйте UNION ALL для повышения производительности.

0
gyan 25 Фев 2016 в 18:44