当前位置: 首页 > 面试题库 >

如何选择我或我的朋友在新闻源中创建的帖子?

鲜于凯康
2023-03-14
问题内容

我已经尝试了很长时间了,然后才发现它是SQL查询,因此我一开始无法使其正常工作。

我正在尝试创建一个类似于Facebook的简单新闻提要页面,您可以在其中看到您在个人资料以及您的朋友个人资料上发布的帖子,还可以看到您的朋友在您的个人资料以及他们自己的个人资料上发表的帖子。

SELECT 
    friendsTbl.profile_one,
    friendsTbl.profile_two,
    user_profile.u_id as my_uid,
    user_profile.f_name as my_fname,
    user_profile.l_name as my_lname,
    friend_profile.u_id as friend_uid,
    friend_profile.f_name as friend_fname,
    friend_profile.l_name as friend_lname,
    profilePostTbl.post as post,
    profilePostTbl.post_to as posted_profile,
    profilePostTbl.post_by as posted_by
FROM friendsTbl
LEFT JOIN profileTbl AS user_profile ON user_profile.profile_name = IF(friendsTbl.profile_one = 'john123', friendsTbl.profile_one, friendsTbl.profile_two)
LEFT JOIN profileTbl AS friend_profile ON friend_profile.profile_name = IF(friendsTbl.profile_one = 'john123', friendsTbl.profile_two, friendsTbl.profile_one)
LEFT JOIN profilePostTbl ON (post_by = IF(profilePostTbl.post_to = friendsTbl.profile_one,profilePostTbl.post_to, profilePostTbl.post_by))
WHERE friendsTbl.profile_one = 'john123' OR friendsTbl.profile_two = 'john123'

这是一个小提琴:http ://sqlfiddle.com/#!2/
a10f39/1

在此示例中,john123是当前登录的用户,并且是hassey,smith和joee的朋友,因此,只有那些帖子必须显示在john123自己或他的朋友的帖子以及他的朋友的帖子所发布的新闻提要中在他们自己的个人资料以及john123的个人资料上。


问题答案:

我知道您已经接受了答案,但是我正在写这篇文章的中途,所以我还是决定将其发布。

在希望回答您的问题之前,我将稍作讨论。在开发应用程序和构建数据库时,您应该 始终
尝试将内容描述和紧凑化。拥有一个变量/列命名color并在其中存储加密的用户密码(很奇怪,对吗?)确实很尴尬。有一些标准的数据库命名约定,在遵循这些约定后,特别是在开发复杂的应用程序时,它们使工作变得更加轻松。我建议您阅读一些有关命名约定的博客。一个很好的起点可能就是这个。

我完全意识到,通过以下建议的更改,您可能需要部分/全部重写到目前为止已编写的应用程序代码,但是,如果您确实希望事情做得更好,则取决于您。

让我们从修复数据库结构开始。从外观上看,您正在做的应用程序类似于facebook的新闻提要。在这种情况下,使用FOREIGN KEYS几乎是强制性的,因此可以保证一定的数据一致性。下面的示例数据库模式显示了如何实现这一点。

-- Application users are stored here.
CREATE TABLE users (
  user_id      INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  first_name   VARCHAR(255),
  last_name    VARCHAR(255),
  profile_name VARCHAR(255)
) ENGINE=InnoDb;

-- User friendship relations go here
CREATE TABLE friends (
  friend_id   INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  profile_one INT NOT NULL,
  profile_two INT NOT NULL,
  FOREIGN KEY (profile_one) REFERENCES users (user_id),
  FOREIGN KEY (profile_two) REFERENCES users (user_id)
) ENGINE=InnoDb;

-- User status updates go here
-- This is what will be displayed on the "newsfeed"
CREATE TABLE statuses (
  status_id    INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  author_id    INT NOT NULL,
  recipient_id INT NOT NULL,
  message      TEXT,
  -- created date ?
  -- last updated date ?
  FOREIGN KEY (author_id)    REFERENCES users (user_id),
  FOREIGN KEY (recipient_id) REFERENCES users (user_id)
) ENGINE=InnoDb;

-- Replies to user statuses go here. (facebook style..)
-- This will be displayed as the response of a user to a certain status
-- regardless of the status's author.
CREATE TABLE replies (
  reply_id  INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  status_id INT NOT NULL,
  author_id INT NOT NULL,
  message   TEXT,
  FOREIGN KEY (status_id) REFERENCES statuses (status_id),
  FOREIGN KEY (author_id) REFERENCES users    (user_id)
) ENGINE=InnoDb;

现在,此问题已解决,我们可以继续下一步-为john123(拥有user_id=1)的人选择新闻源。这可以通过以下查询来实现:

SET @search_id:=1; -- this variable contains the currently logged in user_id so that we don't need to replace the value more than once in the whole query.

SELECT 
    statuses.*,
    author.first_name     AS author_first_name,
    author.last_name      AS author_last_name,
    recipient.first_name  AS recipient_first_name,
    recipient.last_name   AS recipient_last_name
FROM statuses
JOIN users AS author      ON author.user_id    = statuses.author_id
JOIN users AS recipient   ON recipient.user_id = statuses.recipient_id
WHERE (statuses.author_id = @search_id OR statuses.recipient_id = @search_id)
ORDER BY status_id ASC

而在这里,你可以看到它在行动中的sqlfiddle。如您所见,仅通过更好地构建数据库,我就消除了对子查询的需求(EXISTS / NOT EXISTS根据docs和的要求EXPLAIN)。此外,上面的SQL代码将更易于维护和扩展。

无论如何,我希望您觉得这很有用。



 类似资料:
  • 问题内容: 我正在研究“可能的朋友”功能。在这里,我需要向不是我的朋友的所有朋友显示所有朋友,也不要发送给我或没有我的待处理请求 对于每一次友谊,我都会做两个记录。假设用户1和2成为朋友…我要在表中做一个记录,再做一个。 当第一个用户发送请求时,将状态设置为0,而当朋友接受请求时,我将两行都更新为1 如何根据朋友的朋友进行建议“可能的朋友”的sql查询? 问题答案: 在这里,您…简单加入

  • 为了了解在朋友关系中使用Neo4J的优势,我在MySQL数据库上创建了一个Persons表(“Persons”,20900个数据集): 和一张关系表(“友谊”,每个人有50到100个朋友): 因此,大约有120万人的关系。 现在我想查看id=1的人的朋友的朋友的朋友的朋友,因此我创建了一个如下查询: 用户ID 1的查询用了大约30秒 在Neo4J中,我为每个人创建了一个节点(20900个节点)和一

  • 问题内容: 我有一个类似于myspace / facebook的社交网络。在我的代码中,您不是一个人的朋友,还是不是一个朋友,因此,我显示了您与之成为朋友的人的所有操作(在此帖子中,我将这些操作单独称为公告帖子,以使其更易于可视化。 因此,您每当有人发布公告时,都会向在那里的任何朋友显示。 在mysql中,您可以通过执行以下操作来获得个人朋友列表, 我想知道像facebook之类的网站如何显示您的

  • 问题内容: 我有这个问题。给定一个包含社交网络中用户名和用户名的表,该表包含用户名和用户的朋友名,如下所示… …我正在尝试编写一条SQL语句,如果用户在我的网络中,它将执行此操作。换句话说,该用户是朋友还是朋友的朋友? 我一直在围绕这个问题跳舞,只能提出以下查询: 它基本上检查用户是否是我朋友的朋友,即如果为false则仅返回null。 试图弄清楚如何扩展才能遍及我的所有朋友网络。我的意思不仅是我

  • 我有这些桌子; 我试图抓取所有的帖子,由用户正在关注的用户和用户自己的帖子。 我试过了 但问题是,我无法从这个查询中获取用户的帖子。我用or_where etc尝试了其他方法,我能够获得用户的帖子,只是数据增加了三倍:(有人能帮我一下吗?非常感谢。 哦,在普通的Mysql中,它;