【问题标题】:Query to select posts and mark if some of them liked by current user查询以选择帖子并标记当前用户是否喜欢其中一些帖子
【发布时间】:2017-05-03 16:52:44
【问题描述】:

我有 3 张桌子:userpostlike。当我从post 中选择帖子时,我需要标记其中一个是否已被user.id = 1 喜欢。就像在社交网络中一样,您已经喜欢的提要上的帖子 - 已标记。但我是数据库新手,不明白如何更新我的查询以标记帖子是否被user.id = 1 点赞。

我当前的选择如下所示:

SELECT post.id, post.text, post.datetime, user.username,
    (SELECT COUNT(userId) FROM `like` WHERE postId = post.id) AS likes
                    FROM post
                      INNER JOIN user ON user.id = post.authorId;

我还编写了一个查询,通过user.idpost.idlike 中选择一个数据,但不知道如何加入我的两个选择并标记一个帖子:

SELECT * from `like` as lk where lk.userId = 1 and lk.postId = 5;

我目前第一次查询的结果是:

{
    "username": "monica",
    "datetime": "2017-05-02T16:11:31.000Z",
    "id": 3,
    "likes": 2,
    "text": "Do pariatur anim aliqua adipisicing sit non."
}

但我需要,如果我询问 user.id=1 的帖子:

{
    "liked": true, // means that user.id == 1 already liked the post
    "username": "monica",
    "datetime": "2017-05-02T16:11:31.000Z",
    "id": 3,
    "likes": 2,
    "text": "Do pariatur anim aliqua adipisicing sit non."
}

我的桌子:

CREATE TABLE IF NOT EXISTS user (
    id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(15),
    // ...
);

CREATE TABLE IF NOT EXISTS post (
    id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
    text VARCHAR(500),
    authorId INT UNSIGNED,
    // ...
);

CREATE TABLE IF NOT EXISTS `like` (
  postId INT UNSIGNED,
  userId INT UNSIGNED,
  PRIMARY KEY (postId, userId)
);

【问题讨论】:

    标签: mysql sql database select


    【解决方案1】:

    我有点生疏了,所以可能有一种更有效的方法可以做到这一点,但它确实有效,您可以根据需要进行调整。如果当前用户喜欢它以及总共有多少人喜欢它,则以下内容会获取所有帖子和每个帖子的标记:

    SELECT 
      exists(select 1 from `like` li where li.postId = p.id and li.userId = u.id limit 1) as liked
      , u.username
      , p.id as postId
      , p.text
      , (select count(distinct l.userId) from `like` l where l.postId = p.id) as liked
    FROM
      user u,
      post p
    WHERE
      u.id = 2; 
    

    【讨论】:

    • 哇!谢谢,它有效!我使用内部连接来获取帖子作者的用户名
    • 哎呀,是的,忘记了那部分。很高兴它有帮助。不客气。
    • 顺便说一句,注意不要因为内部连接而删除行。你可能不得不做这样的事情: SELECT exists(select 1 from like li where li.postId = p.id and li.userId = u.id limit 1) as like like , up.username , p.id作为 postId , p.text , (select count(distinct l.userId) from like l where l.postId = p.id) as like FROM user u, user up inner join post p on up.id = p.authorId WHERE u.id = 2;
    • 太好了,你救了我
    猜你喜欢
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多