0

特定のメンバーの友達ではないメンバーを返すクエリを見つけるのに苦労しています。これが私のテーブルのレイアウトです:

会員ログイン:

MemberID, email, password

member_info:

memberID, first_name, last_name

member_friends:

friendID, req_member, req_date, app_member, app_date, date_deactivated

NOT INを使用して、友達の反対を返すクエリを実行しようとしましたが、何も機能していないようです。これが私がうまくいくと思ったものです:

SELECT Mi.First_Name, Mi.Last_Name
  FROM Member_Info Mi
 WHERE Mi.Memberid NOT IN(
                           SELECT Mi.Memberid, Mi.First_Name, Mi.Last_Name
                             FROM Member_Info Mi, Member_Login Ml, Member_Friends Mf
                            WHERE Mi.Memberid = Ml.Memberid
                               AND (Mi.Memberid = Mf.Req_Member
                                   AND Mf.App_Member = 1
                                   OR Mi.Memberid = Mf.App_Member
                                   AND Mf.Req_Member =1)
                               AND Ml.Date_Deactivated <= 0
                               AND Mf.App_Date > 0
                          );

何か案は?

4

3 に答える 3

1

@Thedirktastik、IN句の正しい使用法を確認してください。ここMSDNであなたは見ることができます。

youWHERE句では、INを使用しているため、値を返すサブクエリはMi.Memberid列の値のみを返す必要があります。そして、クエリはいくつかの異なる列を返しています。次のようなものにする必要があります:

....
WHERE Mi.Memberid NOT IN(
                           SELECT Mi.Memberid
                             FROM....
于 2012-09-25T15:26:07.103 に答える
0

これは本当に悪いデザインであり、おそらく反対票の理由です。member_friendsテーブルを交差テーブル(ジャンクションテーブル)にすることを検討します。これにより、デザイン、つまりクエリがはるかに使いやすく、理解しやすくなります。

于 2012-09-25T15:21:49.660 に答える
0

試してみるとどうなりますか

SELECT Mi.First_Name, Mi.Last_Name
  FROM Member_Info Mi
 WHERE Mi.Memberid NOT IN(
                           SELECT Mi.Memberid
                              FROM Member_Info Mi, Member_Login Ml, Member_Friends 
                            WHERE Mi.Memberid = Ml.Memberid
                               AND (Mi.Memberid = Mf.Req_Member
                                   AND Mf.App_Member = 1
                                   OR Mi.Memberid = Mf.App_Member
                                   AND Mf.Req_Member =1)
                               AND Ml.Date_Deactivated <= 0
                               AND Mf.App_Date > 0
                          );

NOT IN(...)で3つの値を返す必要があるのに、1つである必要があるためです。

SELECT Mi.Memberid, Mi.First_Name, Mi.Last_Name

する必要があります

SELECT Mi.Memberid

値を比較するためにテーブルに結合する必要があるため、FROMステートメントについて別のエラーが発生する可能性がありますが、フレンドテーブルには一致する値がないため、これが問題になる可能性があります(設計が不十分)

編集:データベース設計

これの多くは実際に経験することになりますが、 HeadFirstSQLRelationalDatabaseDesign Clearly Explained(データ管理システムのMorgan Kaufmannシリーズ)(ペーパーバック)のようにチェックできる優れた本がいくつかあります。基本と基本的なデザインを学ぶ、私はあなたがそれらをチェックすることをお勧めします

于 2012-09-25T15:25:31.233 に答える