1

ユーザーがログインしてメッセージを投稿するための小さなサイトのセットアップに取り組んでいます。連絡先を保存するテーブルをセットアップ中です (ユーザーがボード上でメッセージを表示して相互に送信できるようにするため)。構成はほぼ完了しましたが、障害が発生しました。

 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 のユーザーの選択クエリの出力で構成する必要があります。ユーザー自身のエントリを省略し (つまり、自分自身を追加するべきではありません)、(厄介な部分はme)、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'

出力から、すでに招待されたユーザーや追加されたユーザーのリストが表示されないようにしますか?

どんな助けでも大歓迎です。

4

1 に答える 1

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) 経由で自分自身に接続されているユーザーも除外します。)

于 2013-08-23T07:04:14.343 に答える