MySQL список контактов - PullRequest
       2

MySQL список контактов

0 голосов
/ 16 ноября 2011

Я создаю веб-приложение codeigniter, где пользователи могут добавлять друг друга в список контактов.

Таблица выглядит следующим образом:

`id` int(11) NOT NULL AUTO_INCREMENT,
 `user_1` int(11) NOT NULL,
 `user_2` int(11) NOT NULL,
 `accepted` tinyint(2) NOT NULL,
  PRIMARY KEY (`id`)

ИД пользователя для пользователяпри этом запрос на добавление контакта всегда сохраняется в столбце user_1 .Другие пользователи ИД пользователя хранятся в user_2 . user_2 затем должен принять запрос, и столбец «принято» обновляется до 1 .

Я хочу перечислить все принятые контакты (ГДЕ принято = 1) в html-таблице, а запросы контактов (принято = 0) в другой.Мой вопрос: как я могу сделать запрос MySQL, который выбирает все строки и просто получить идентификатор пользователя из контакта?Это проблема, поскольку они могут быть либо в user_1 , либо в user_2 (в зависимости от того, были ли они запрошены или приняты).

Должен ли я каким-либо образом изменить таблицу БД надостичь этого.Или я мог бы сделать запрос (предпочтительно активные rcords), который выполняет это?

Любая помощь приветствуется

Заранее спасибо

Джордж

Обновление:

Итак, окончательный запрос выглядит так:

SELECT DISTINCT users.id, users.username, contacts.accepted 
FROM users
LEFT JOIN contacts ON users.id = contacts.user_1
WHERE contacts.user_2 = ' . $this->session->userdata('user_id') . '
UNION DISTINCT
SELECT DISTINCT users.id, users.username, contacts.accepted 
FROM users 
LEFT JOIN contacts ON users.id = contacts.user_2
WHERE user_1 = ' . $this->session->userdata('user_id')

И работает точно так, как я описал:)

Ответы [ 4 ]

1 голос
/ 16 ноября 2011

Используйте запрос UNION. См. документацию .

SELECT DISTINCT user_1 userid FROM user WHERE accepted = 1
UNION DISTINCT
SELECT DISTINCT user_2 userid FROM user WHERE accepted = 1

Что касается объединения, вы должны использовать что-то вроде ниже для каждой части UNION

SELECT DISTINCT users.userid, users.username, contacts.accepted 
FROM users
LEFT JOIN contacts ON users.userid = contacts.user_1
WHERE contacts.user_2 = ?
0 голосов
/ 16 ноября 2011

Псевдоним с объединениями - это, что я думаю, вы спрашиваете.

Что-то вроде.

Select c.id, uRequest.UserName, uRequested.UserName From Contacts c 
  inner join Users As uRequest On c.User_1 = uRequest.id
  inner join Users As uRequested On c.User_2 = URequested.id
Where accepted = 1

даст вам все контакты, где запрос был принят.

0 голосов
/ 16 ноября 2011

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

0 голосов
/ 16 ноября 2011

Разве список контактов не должен принадлежать пользователю?

create table Contactlist (
  OwnerID int, -- ID of the owning User
  ContactID int, -- ID of the contact User
  Accepted bool)
-- With composite primary key on OwnerID, ContactID

Таким образом, запрос будет

select * from User
  left outer join Contactlist on User.ID = Contactlist.OwnerID
  left outer join User as Contact on Contactlist.ContactID = Contact.ID

Извините ... Свергнуть выбор;)

select * from Contactlist
  inner join User on Contactlist.ContactID = User.ID
  where Contactlist.OwnerID = <the querying users ID>

(синтаксис MSSQL)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...