Mysql
 sql >> Baza danych >  >> RDS >> Mysql

zapytanie mysql w zapytaniu z kontrolą warunków prywatności

Spróbuj tego zapytania (również na 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;

Usunąłem username pole z posts tabeli, ponieważ jest zbędna. Ponadto nazwałem tabele i kolumny nieco inaczej, więc zapytanie może wymagać kosmetycznych zmian w schemacie.

Pierwsza linia w WHERE klauzula jest tą, której szukasz, wybiera posty w następującej kolejności:

  1. Pierwsze posty członków bez prywatności;
  2. Wtedy posty od członków, które są obserwowane przez obecnego searcher;
  3. Na koniec posty samego członka.

EDYTUJ:

To zapytanie używa oryginalnych identyfikatorów:

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;

EDYCJA 2:

Aby uniknąć duplikatów w przypadku, gdy użytkownik ma kilku obserwujących z posts warunki tabeli, złączenia i filtrowania należy zmienić w następujący sposób (na 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. tabela mysql z ponad 40 kolumnami

  2. Dowiedz się, jak importować dane z Excela do bazy danych MySQL

  3. Wstaw do bazy danych MySQL za pomocą jQuery i PHP

  4. Ostatni indeks ciągu znaków MySQL

  5. Wstaw/wyświetl obraz do/z bazy danych MySQL