歴史:
イベントにはたくさんの参加者がいます。参加者全員がイベントでお互いに会い、実際に好きな他のすべての参加者に「いいね」を出します。
イベントの最後に、管理者はそのイベントの各参加者のすべてのいいねを挿入し、システムは相互のいいね(友情)を見つけます
問題:いいねを挿入している間、天気を検出するシステムが(他のイベントからも)すでに確立されていることを望みます(しゃれ)。そうであれば、いいねを設定するときにそのユーザー名を表示しないようにします。
これが私が使用しているテーブルです(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