Mysql
 sql >> база данни >  >> RDS >> Mysql

mysql заявка в рамките на заявка с проверка на условията за поверителност

Моля, опитайте тази заявка (също на 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;

Премахнах 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sugarcrm, писане на персонализиран код, докато запазвате записа

  2. Ще промени ли промяната на часова зона на MySQL стойностите на полетата DateTime в база данни?

  3. Получаване на последната въведена стойност в Yii

  4. Намерете най-стария запис в съединение между две таблици

  5. mysql сравнение на дата с date_format