contactlist mysql查询

时间:2011-11-16 12:31:44

标签: php mysql codeigniter

我正在制作一个codeigniter webapp,用户可以在联系人列表中互相添加。

表格如下:

`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`)

发出添加联系人请求的用户的用户ID 始终存储在 user_1 列中。其他用户用户ID 存储在 user_2 中。然后 user_2 必须接受请求,并且“已接受”列会更新为 1

我想列出html表中接受的所有联系人(WHERE accepted = 1),以及另一个联系人请求(accepted = 0)。 我的问题是:我如何创建一个mysql查询,选择所有行,只是从联系人获取用户ID?这是一个问题,因为它们可以是 user_1 user_2 (取决于他们是否请求或接受)。

我应该以某种方式更改db表来实现此目的。或者我可以进行查询(最好是活动的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 个答案:

答案 0 :(得分:1)

使用UNION查询。请参阅documentation

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 = ?

答案 1 :(得分:0)

联系人列表不应归用户所有吗?

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

<击> 对不起......选择了Overthunk;)

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

(MSSQL语法)

答案 2 :(得分:0)

您可以使用查询,但稍后会产生问题,因为我之前也遇到过这个问题。当用户接受请求并将新记录标记为已接受时,您可以在同一个表中插入新条目,但这次user_1变为user_2,反之亦然。

答案 3 :(得分:0)

使用连接的别名是我认为你要问的。

类似的东西。

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

将为您提供已接受请求的所有联系人。