我创建了一个小社交网站,其中有三个简单的表格如下所示。
user1
用户可以阻止他们想要的任何人,如果阻止发生,两个用户将不再在他们的新进程中看到彼此的帖子。
在我的表格中,user2
和 select * from Post p
where p.user_id not in
(select b.blocked_to from Block b
where b.block_by = '$_SESSION[userid]')
不会看到彼此的帖子,但是' user3'通常会看到每个人'发布,因为他不属于表格块。
public ActionResult AddDemande()
{
Demande demande = new Demande();
return View(demande);
}
[HttpPost]
public ActionResult AddDemande(Demande demande, HttpPostedFileBase file)
{
try
{
if (!ModelState.IsValid)
{
return View();
}
else
{
DemandeService demandeService = new DemandeService();
demandeService.CreateDemande(demande);
if (!file.ContentType.Contains("pdf"))
{
TempData.Add("attension", "le cv doit être sous format pdf");
ModelState.AddModelError(string.Empty, "Unable to save changes. Try again, le fichier joint doit être sous format pdf.");
return RedirectToAction("AddDemande");
}
demande.Date = DateTime.Now;
demande.etat = "en attente";
BinaryReader fileReader = new BinaryReader(file.InputStream);
byte[] files = fileReader.ReadBytes(file.ContentLength);
demande.fichier = files;
AdherentService adherentService = new AdherentService();
Adherent adherent = (Adherent)Session["logedAd"];
demande.nomBeneficiaire = adherent.nom;
demande.eMailBeneficiaire = adherent.eMail;
demande.beneficiare = adherent;
adherent.listDemandes.Add(demande);
adherentService.Updateadherent(adherent);
demande.beneficiare = adherent;
Session.Remove("logedAd");
Session.Add("logedAd", adherent);
return RedirectToAction("Login");
}
}
catch
{
return RedirectToAction("Index", "Home");
}
}
从SQL查询中,user1无法查看user2的帖子,但是user2仍然看到了user1帖子,这是我不想要的。对于这种情况,我能做的最好的查询是什么? 还请考虑我的数据库设计是这个好方法吗?你可以建议我,非常感谢:))
答案 0 :(得分:2)
您必须检查block_by
和block_to
字段。
SELECT * FROM Post p
WHERE p.user_id NOT IN (
SELECT b.blocked_to AS userId FROM Block b
WHERE b.block_by = {$_SESSION['userid']}
UNION DISTINCT
SELECT b.blocked_by AS userId FROM Block b
WHERE b.block_from = {$_SESSION['userid']}
)
访问$_SESSION
数组($_SESSION['userid']
而不是$_SESSION[userid]
)中的字段时,您还应该使用引号。
答案 1 :(得分:2)
我会尝试加入Post
和Block
表,以过滤掉属于其他可能被阻止的用户的给定用户(您通过会话获得)请求的帖子:
SELECT * FROM Post p INNER JOIN Block b
ON p.user_id = b.blocked_by
WHERE b.blocked_to <> '$_SESSION[userid]'
我还会稍微修改您的架构,以在Block
表中包含两个关系:
+---------+---------------+-----------------+
| id (pk) | block_by (fk) | blocked_to (fk) |
+---------+---------------+-----------------+
| 1 | 1 | 2 |
| 2 | 2 | 1 |
+---------+---------------+-----------------+
首先,我认为这是表达双向关系的最简单方式。在最坏的情况下,Block
表的大小会加倍。此外,您不知道在将来的某个时刻您是否会遇到块是单向的情况。例如,您可能允许用户1阻止用户2,其中用户1仍然可以阅读用户2帖子,但反之亦然。
答案 2 :(得分:0)
抱歉 - 我还没有想到这一点,但我认为你可以在你的用户不在任何一个Block列的情况下使用一个连接到阻止表。但是我认为这意味着每个帖子都会加入阻止表中的每个符合条件的行 - 因此添加了“不同”的行。避免重复。优化器是否可以在不进行大规模表扫描的情况下处理这个问题,我不确定,但是这个想法可供讨论。
select distinct post.id from Post
left outer join Block on block_by <> $_SESSION['userid']
and blocked_to <> $_SESSION['userid'];