1

歴史:

イベントにはたくさんの参加者がいます。参加者全員がイベントでお互いに会い、実際に好きな他のすべての参加者に「いいね」を出します。

イベントの最後に、管理者はそのイベントの各参加者のすべてのいいねを挿入し、システムは相互のいいね(友情)を見つけます

問題:いいねを挿入している間、天気を検出するシステムが(他のイベントからも)すでに確立されていることを望みます(しゃれ)。そうであれば、いいねを設定するときにそのユーザー名を表示しないようにします。

これが私が使用しているテーブルです(mysql)

wp_fd_users

id | user_name | user_gender | ... etc
1  | x         | 0           | ...
2  | y         | 0           | ...
3  | z         | 1           | ...
4  | q         | 1           | ...

wp_fd_subscriptions

id | event_id | event_user_id | ...etc
1  | 1        | 1             | ...etc
2  | 1        | 2             | ...etc
3  | 1        | 3             | ...etc
4  | 1        | 4             | ...etc

wp_fd_matches

id | event_id | event_user_id | event_user_match_id | ... etc
1  | 1        | 1             | 3                   | ... etc
2  | 1        | 3             | 1                   | ... etc
3  | 1        | 1             | 4                   | ... etc

これは、ゴードン・リノフが非相互の友達を返すために親切に私にくれた質問です

select m1.*
from wp_fd_matches m1 left outer join
     wp_fd_matches m2
     on m1.event_id = m2.event_id and
        m1.event_user_id = m2.event_user_match_id
        m1.event_user_match_id = m2.event_user_id
where m2.id is null

次に、それを次のクエリに統合する必要があります(そして、このサブクエリがすべてのレコードを返さないように少し最適化してから、それらをフィルタリングします)-ここではすでに挿入されています:

SELECT *, wp_fd_users.id AS userid, wp_fd_users.user_gender AS usergender
FROM wp_fd_subscriptions JOIN wp_fd_events ON event_id = wp_fd_events.id
JOIN wp_fd_users ON event_user_id = wp_fd_users.id
WHERE (wp_fd_subscriptions.event_id = 1
  AND wp_fd_users.id != 2 AND wp_fd_users.user_gender != 0
  AND wp_fd_users.id IN (
    select m1.user_event_match_id
    from wp_fd_matches m1 left outer join
    wp_fd_matches m2 on m1.event_id = m2.event_id and
      m1.event_user_id = m2.event_user_match_id and
      m1.event_user_match_id = m2.event_user_id where m2.id is null
    )
)
ORDER BY wp_fd_users.user_name;

これにより、ユーザーテーブルとイベントテーブルに結合されたサブスクリプションテーブルのすべてのレコードが返されます。具体的には、私が取得する必要があるのは、特定のイベントに参加した特定のユーザーの相互の友人ではありません。

上記のSQLは、現時点では常に同じ行を表示します。

他のユーザーと関係のあるユーザーを避けているようです

また、クエリでユーザーの性別を変更すると、常にゼロの結果が得られます。

編集:必要なものを正確に定義するのは非常に難しいですが、うまくいけばそこに到達しています:クエリは次のすべてのユーザーを返す必要があります:1。wp_fd_matchesテーブルにエントリがまったくない場合でもイベント1に参加した2.ではない集中ユーザー3.いかなる場合でも集中ユーザーと相互関係を持たない

他の議論へのリンクはここにあります:相互の非相互の友人クエリmysql

4

2 に答える 2

1

event_id=1およびユーザーID=1

SELECT u.*
FROM wp_fd_subscriptions AS s
JOIN wp_fd_users AS u 
   ON s.event_user_id = u.id
LEFT JOIN wp_fd_matches m1 
   ON m1.event_id = s.event_id 
   AND m1.event_user_id = 1
   AND m1.event_user_match_id = s.event_user_id
LEFT JOIN wp_fd_matches m2
   ON m1.event_id = m2.event_id 
   AND m2.event_user_id = m1.event_user_match_id
   AND m2.event_user_match_id = 1
WHERE s.event_id=1 AND u.id != 1 AND m2.id IS NULL;
于 2012-08-21T10:05:06.627 に答える
0

質問は不明確です。uが言ったように、userid4は結果セットに含まれます

SELECT *, wp_fd_users.id AS userid, wp_fd_users.user_gender AS usergender
    FROM wp_fd_subscriptions JOIN wp_fd_events ON event_id = wp_fd_events.id
    JOIN wp_fd_users ON event_user_id = wp_fd_users.id
    WHERE (wp_fd_subscriptions.event_id = 1
      AND wp_fd_users.id != 2 AND wp_fd_users.user_gender != 0
      AND wp_fd_users.id IN (
        select m1.event_user_match_id 
        from wp_fd_matches m1 left outer join
        wp_fd_matches m2 on m1.event_id = m2.event_id and
          m1.event_user_id = m2.event_user_match_id and
          m1.event_user_match_id = m2.event_user_id where m2.id is null
        )
    )
    ORDER BY wp_fd_users.user_name;

編集::

SELECT *, wp_fd_users.id AS userid, wp_fd_users.user_gender AS usergender
FROM wp_fd_subscriptions JOIN wp_fd_events ON event_id = wp_fd_events.id
JOIN wp_fd_users ON event_user_id = wp_fd_users.id
WHERE (wp_fd_subscriptions.event_id = 1
  AND wp_fd_users.id != 2 AND wp_fd_users.user_gender != 0
  AND( wp_fd_users.id IN (
    select m1.user_event_match_id
    from wp_fd_matches m1 left outer join
    wp_fd_matches m2 on m1.event_id = m2.event_id and
      m1.event_user_id = m2.event_user_match_id and
      m1.event_user_match_id = m2.event_user_id where m2.id is null
    ) or NOT EXISTS (SELECT * FROM wp_fd_matches b 
                       where  wp_fd_users.id =b.user_event_match_id))
)
ORDER BY wp_fd_users.user_name;
于 2012-08-21T07:55:37.107 に答える