sql >> Databasteknik >  >> RDS >> Mysql

mysql-fråga i en fråga med sekretesskontroll

Pröva den här frågan (även på 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
  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;

Jag tog bort username fält från posts bord, eftersom det är överflödigt. Jag namngav också tabeller och kolumner något annorlunda, så frågan kan behöva kosmetiska ändringar för ditt schema.

Den första raden i WHERE satsen är den du letar efter, den väljer inlägg i följande ordning:

  1. Första inlägg från medlemmar utan sekretess;
  2. Inlägg sedan från medlemmar som följs av den nuvarande searcher;
  3. Slutligen, inlägg från medlemmen själv.

EDIT:

Den här frågan använder ursprungliga identifierare:

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;

EDIT 2:

För att undvika dubbletter om det finns flera följare för användaren från posts tabell, join och filtreringsvillkor bör ändras på följande sätt (på 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. Laravel-modell med POINT/POLYGON etc. med DB::råuttryck

  2. Körs utlösaren BEFORE INSERT för varje rad i infogning vid dubblettnyckeluppdateringsfråga

  3. Installera Oracle Forms and Reports 11g version 2

  4. Infoga data från Perl till MysQL