我一直在设置一个小网站供用户登录和发布消息。我正在设置存储联系人的表(以便用户可以在板上查看和发送消息)。我差不多完成配置但遇到了障碍。
When a user registers for the first time, an entry is created in each of two tables; users and contacts. The users table stores username and password stuff, the contacts table stores a directory of people on the system and whether they've been added to other people's contact lists. The tables look like this;
mysql> select userid, firstname, lastname, username from users;
+--------+-----------+----------+----------+
| userid | firstname | lastname | username |
+--------+-----------+----------+----------+
| 63 | Chris | Smith | csmith |
| 64 | Susan | Smith | ssmith |
| 65 | Roger | Smith | rsmith |
| 66 | Diane | Smith | dsmith |
+--------+-----------+----------+----------+
4 rows in set (0.00 sec)
mysql> select * from contacts;
+----------+---------+-----------+
| username | contact | confirmed |
+----------+---------+-----------+
| csmith | csmith | 0 |
| ssmith | ssmith | 0 |
| rsmith | rsmith | 0 |
| dsmith | dsmith | 0 |
| csmith | dsmith | 2 |
| dsmith | csmith | 2 |
| dsmith | ssmith | 1 |
| dsmith | rsmith | 1 |
+----------+---------+-----------+
8 rows in set (0.00 sec)
用户可以进行身份验证,他们可以毫无问题地相互添加和删除。 “已确认”列存储联系人的状态。 0用于指示在注册时为用户进行的联系中的初始条目。 1表示邀请是否已从用户名发送到联系人但尚未确认。 2表示已确认联系人。通过对网站的不同部分进行选择查询,我可以显示用户的联系人列表,或者只显示他们可能添加但尚未添加的系统上的人员列表。除了未经邀请的联系人目录列表之外,几乎所有事情都能正常工作。
联系人的初始列表应该由选择查询的输出组成,用于已确认状态为0的用户,它应该省略用户自己的条目(因此,他们不应该添加自己让我们说),(令我感到烦恼的一部分,它也应该省略任何人使用他们自己的用户名确认1(邀请已发送)或2(已确认联系人)。
所以,csmith应该在他的用户目录中看到ssmith和rsmith但是不应该看到dsmith因为dsmith已经被添加到他的联系人中(在联系人的第5个条目确认2)。
因此,考虑到这些规则,我一直很难想到一种方法来查询目录查找的查询。我怎样才能创建一个规则;
select contact from contacts where username!=$authenticated_user and confirmation='0'
这将为我提供系统上的用户列表,除了我自己,尚未被邀请的人。
然后也退出
select contact from contacts where username=$authenticated_user and confirmation='1' and confirmation='2'
输出,以便已经邀请和/或添加的用户列表不再显示?
感谢任何帮助。
答案 0 :(得分:0)
SELECT DISTINCT `contact`
FROM test.test
WHERE `contact`
NOT IN
(SELECT `contact`
FROM test.test
WHERE `username` = "csmith");
相互友谊的任何条目都以格式(a - > b)和(b - > a)给出,所有邀请都以格式(a - > b)给出,简化了测试 - 我们只是在联系人条目中查找没有$ username(p.ex。“csmith”)作为用户名的任何用户。
(这也确实排除了默认通过(a,a,0)连接到自己的用户。)