sql >> Databáze >  >> RDS >> Mysql

dotaz mysql v rámci dotazu s kontrolou stavu soukromí

Zkuste prosím tento dotaz (také 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;

Odebral jsem username pole z posts tabulky, protože je nadbytečná. Také jsem pojmenoval tabulky a sloupce mírně odlišně, takže dotaz může vyžadovat kosmetické změny vašeho schématu.

První řádek v WHERE klauzule je ta, kterou hledáte, vybírá příspěvky v následujícím pořadí:

  1. První příspěvky od členů bez soukromí;
  2. Poté příspěvky od členů, které sleduje aktuální searcher;
  3. Nakonec příspěvky samotného člena.

UPRAVIT:

Tento dotaz používá původní identifikátory:

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;

ÚPRAVA 2:

Aby se předešlo duplicitám v případě, že má uživatel několik sledujících z posts tabulky, podmínky spojení a filtrování by se měly změnit následujícím způsobem (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. Připojte se pomocí možnosti local-infile v MySql Workbench

  2. Získejte aktualizované položky tabulky MySQL v pythonu bez uzavření připojení

  3. Použití případu v kontrolním omezení

  4. <textarea> a MYSQL pro zobrazení dat v php