如何在mysql中的select语句中过滤结果

时间:2013-08-23 06:03:00

标签: php mysql

我一直在设置一个小网站供用户登录和发布消息。我正在设置存储联系人的表(以便用户可以在板上查看和发送消息)。我差不多完成配置但遇到了障碍。

 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'
输出

,以便已经邀请和/或添加的用户列表不再显示?

感谢任何帮助。

1 个答案:

答案 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)连接到自己的用户。)