Mysql
 sql >> Database >  >> RDS >> Mysql

query mysql all'interno di una query con controllo delle condizioni di privacy

Per favore, prova questa query (anche su 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;

Ho rimosso username campo da posts tabella, in quanto ridondante. Inoltre, ho nominato tabelle e colonne leggermente diverse, quindi la query potrebbe richiedere modifiche estetiche per il tuo schema.

La prima riga nel WHERE la clausola è quella che stai cercando, seleziona i post nel seguente ordine:

  1. I primi post di membri senza privacy;
  2. Quindi i post dei membri seguiti dall'attuale searcher;
  3. Infine, i post del membro stesso.

MODIFICA:

Questa query utilizza identificatori originali:

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:

Per evitare duplicati nel caso in cui ci siano più follower per l'utente dai posts le condizioni di tabella, join e filtro devono essere modificate nel modo seguente (su 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;