sql >> データベース >  >> RDS >> Mysql

プライバシー条件チェックを使用したクエリ内のmysqlクエリ

    このクエリを試してください( SQLFiddle でも試してください。 ):

    SELECT p.id, p.user_id, m.username, m.privacy,
           searcher.username "Searcher", p.status_msg
      FROM posts p
      JOIN members m ON m.id = p.user_id
      LEFT JOIN following f ON p.user_id = f.user_id
      JOIN members searcher ON searcher.username = 'userA'
     WHERE (m.privacy = 0 OR (m.privacy = 1 AND f.follower_id = searcher.id)
                          OR m.id = searcher.id)
       AND p.status_msg LIKE '%New%'
     ORDER BY p.id
     LIMIT 5;
    

    usernameを削除しました postsのフィールド 冗長であるため、テーブル。また、テーブルと列の名前を少し異なるため、スキーマの外観を変更する必要がある場合があります。

    WHEREの最初の行 句はあなたが探しているものであり、次の順序で投稿を選択します:

    1. プライバシーのないメンバーからの最初の投稿;
    2. 次に、現在のsearcherが続くメンバーからの投稿;
    3. 最後に、メンバー自身の投稿。

    編集:

    このクエリは元の識別子を使用しています:

    SELECT p.id, p.`userID`, m.username, m.privacy,
           searcher.username "Searcher", p.`statusMsg`
      FROM posts p
      JOIN `myMembers` m ON m.id = p.`userID`
      LEFT JOIN following f ON p.`userID` = f.user_id
      JOIN `myMembers` searcher ON searcher.username = 'userD'
     WHERE (m.privacy = 0 OR f.follower_id = searcher.id OR m.id = searcher.id)
       AND p.`statusMsg` LIKE '%New%'
     ORDER BY p.id
     LIMIT 5;
    

    編集2:

    postsからユーザーのフォロワーが複数いる場合に重複を避けるため テーブル、結合、およびフィルタリングの条件は、次のように変更する必要があります( SQL Fiddle > ):

    SELECT p.id, p.user_id, m.username, m.privacy,
           searcher.username "Searcher", p.status_msg
      FROM posts p
      JOIN members m ON m.id = p.user_id
      JOIN members searcher ON searcher.username = 'userC'
      LEFT JOIN following f ON p.user_id = f.user_id
       AND follower_id = searcher.id
     WHERE (m.privacy = 0 OR (m.privacy = 1 AND f.id IS NOT NULL)
                          OR m.id = searcher.id)  
     ORDER BY p.id
     LIMIT 5;
    


    1. .Net接続プールMySQL一時テーブル

    2. 動的OraclePivot_In_Clause

    3. 2つのセットを比較するTSQL

    4. 巨大なデータウェアハウステーブルをロードするより高速な方法