Mysql 用于帖子的社交网络SQL语句

Mysql 用于帖子的社交网络SQL语句,mysql,sql,Mysql,Sql,我一直在一个社交网络上工作,以加深我对PHP的了解,但是我已经到了一个地步,我将根据用户是谁的“朋友”从数据库中获取帖子 我的朋友数据库结构如下: USER_A | USER_B | CREATED_AT | IS_BLOCKED 然后对于职位: USER | UPDATE | STATUS 因此,如果登录的用户与发布帖子的用户是朋友,我想显示从我的帖子表中选择的帖子 所以,基本上,我想知道是否有人有任何建议。它不会比这更复杂,对交朋友或诸如此类的朋友不感兴趣。所以,我想知道是否有人能用这个

我一直在一个社交网络上工作,以加深我对PHP的了解,但是我已经到了一个地步,我将根据用户是谁的“朋友”从数据库中获取帖子

我的朋友数据库结构如下:

USER_A | USER_B | CREATED_AT | IS_BLOCKED
然后对于职位:

USER | UPDATE | STATUS
因此,如果登录的用户与发布帖子的用户是朋友,我想显示从我的帖子表中选择的帖子

所以,基本上,我想知道是否有人有任何建议。它不会比这更复杂,对交朋友或诸如此类的朋友不感兴趣。所以,我想知道是否有人能用这个给我指出正确的方向

我读到它需要连接,但是我从来没有真正接触过SQL的这一面,因此我不知道我将如何使用它,因此如果需要,请链接到相关问题和文章

谢谢

(我本质上是在寻找SQL语句的帮助,而不是PHP。)

更新#1:

我已经让newsfeed工作了,现在我需要能够加入一个语句来显示用户名。我目前的状态是:


在任何人热衷于以明文形式存储密码之前,这不是一个公共系统,完全由我来测试,而对非公共脚本的密码进行哈希运算(我只会使用假密码)几乎不存在安全风险,这只会让调试变得很痛苦。

如果我正确理解了您描述的db模式,这将为您带来与登录用户为好友的用户编写的所有帖子

 SELECT * FROM posts WHERE posts.user IN (SELECT user_b FROM friendships WHERE user_a=$logged_in_user)

查询非常简单。您可以从表
posts
中获得所有行,该post的创建者在您的
friendships
表中有一行作为user\u b,而user\u a被设置为登录用户。

类似的操作应该可以:

SELECT * FROM posts 
JOIN friends ON posts.user = friends.user_b
WHERE user_a = 'someuser'

在这个语句中,我们连接到tables:posts和friends,基于两列的值,我们将post表的列user与friends表的列user_b联系起来,通过这种方式,我们将获得一个结果集,该结果集仅包含两个表的值,其中两个相关列是相等的…

我假设了一些事情,如果它们不正确,您将不得不修改这些内容,但如果我是对的,这些操作将不需要任何
连接

  • $userSession
    变量包含登录用户的ID
  • $userToView
    变量包含试图查看其ID的用户
  • 您的数据库结构只有一个条目用于两个好友用户,因此我们必须检查这两个组合
  • 要确定用户是否是朋友,请执行以下操作:

    SELECT user_a, user_b FROM friends
    WHERE (user_a = $userSession AND user_b = $userToView)
    OR (user_a = $userToView AND user_b = $userSession)
    LIMIT 1;
    
    然后在PHP中使用
    if
    语句(通常最好将业务逻辑保存在应用程序中,而不是数据库中),如果是真的,则返回帖子

    $results = $mysqli->query($query)->fetch_row();
    if($results) {
        ... return posts ...
    } else {
        echo 'Not friends';
    }
    
    这将是一个类似以下内容的查询:

    SELECT * FROM posts
    WHERE user = $userToView;
    

    您需要阅读有关(不要使用mysql插件,它已被弃用)以及如何防止它们的内容。这听起来可能有点麻烦,但如果你不理解这些东西,那么理解这些东西远比处理这些后果要困难得多。

    做a可能会让人们更容易帮助你。在朋友表中代表用户的是什么?@aleroot User_B是请求确认后与之成为朋友/被请求成为朋友的人的用户。目前,每一份友谊、一份数据库记录都是单向的这将检索名称。用al_users.id而不是名字加入。谢谢,我已经转到PDO了。几个月前就做了,这是一个真正伟大的举动,可以用它做更多的事情,它比MySQL函数好得多,感谢SQL语法!我不认为这会那么简单,现在如果我要在同一条语句中获取用户的信息,那需要加入吗?因为我将从另一个表中获取数据?没问题,希望它能有所帮助。@JakeBall-如果您想同时从两个表中获取数据(在一个查询中),则需要一个
    连接。例如,如果您在
    posts
    users
    中使用用户的
    id
    作为主键,但您需要
    users
    表和
    posts
    表中的
    post
    中的
    real\u name
    ,那么,这通常需要对数据库进行两次查询吗?如果我在一个页面上有多个帖子,我会看到很多查询,难道没有其他方法来简化这个问题吗?@JakeBall-这将总共使用两个查询,而不是每个帖子两个查询。一旦你知道他们是朋友,你就可以使用
    fetch_assoc()
    函数在关联数组中通过
    $userToView
    返回每篇文章。你能解释一下语句中实际发生了什么吗?虽然它可能会起作用,但当我再次这样做时,它对我没有帮助。我不想被人用勺子舀答案,而是想了解正在发生的事情。Cheers@JakeBall:如果你不想被人用勺子舀,请阅读一些教程。这是一个问答网站,不是在线培训课程。特别是关于SQL语句的基础知识,你可以在网上找到大量的教程。@DanielHilgarth我也不是在找在线培训课程,只是问他能否解释一下发生了什么。这几乎没有什么帮助,基本上就是为我做的所有事情,没有任何解释。你必须在嵌套查询中使用
    ,由于
    user\u a
    user\u b
    可能是登录用户或要查看的用户。@奥沙沃特我认为这实际上取决于他是否拥有对称或不对称的社交网络。此外,即使它是对称的,我也建议在Frienderships表中添加两行,而不是执行更复杂的查询,因为新闻提要