尝试构建一个 SQL 或 Knex 查询以从用户所属的群组中获取社交帖子

Trying to structure a SQL or Knex query for social posts from groups where user is a member

我使用原始 sql、knex 和 objection.js 查询的组合查询了 4 tables。用户和群组由属于群组的会员资格和帖子相关联

Primary/Foreign 键

用户:id,has_many 会员组 群组:id,has_many 用户通过会员资格 成员资格:id,groups_id,users_id
帖子:id,users_id,groups_id

我正在尝试 return 属于用户所属的所有组的所有帖子。

以下查询,returns 和 posts,但没有提供我需要的所有字段:

SELECT users.username, users.avatar_url, posts.id, posts.body, posts.users_id, posts.groups_id FROM posts INNER JOIN memberships ON posts.groups_id = memberships.groups_id JOIN users on memberships.users_id = users.id WHERE memberships.users_id = ${userId}

具体来说,查询 return id: userId 的 current_user 的头像,而不是 returning 与特定 post 相关的用户信息。

这是对请求的回复:

Result {
  command: 'SELECT',
  rowCount: 9,
  oid: null,
  rows:
   [ { username: 'usersix',
       avatar_url: 'https://image.flaticon.com/icons/svg/145/145864.svg',
       id: 1,
       body: 'user 1 comments to group 1',
       users_id: 1,
       groups_id: 1 },
     { username: 'usersix',
       avatar_url: 'https://image.flaticon.com/icons/svg/145/145864.svg',
       id: 3,
       body: 'user 1 comments to group 1 #2',
       users_id: 1,
       groups_id: 1 },
     { username: 'usersix',
       avatar_url: 'https://image.flaticon.com/icons/svg/145/145864.svg',
       id: 4,
       body: 'user 2 comments to group 1',
       users_id: 2,
       groups_id: 1 },
     { username: 'usersix',
       avatar_url: 'https://image.flaticon.com/icons/svg/145/145864.svg',
       id: 6,
       body: 'user 3 comments to group 1',
       users_id: 3,
       groups_id: 1 },
     { username: 'usersix',
       avatar_url: 'https://image.flaticon.com/icons/svg/145/145864.svg',
       id: 10,
       body: 'user 5 comments to group 1',
       users_id: 5,
       groups_id: 1 },
     { username: 'usersix',
       avatar_url: 'https://image.flaticon.com/icons/svg/145/145864.svg',
       id: 12,
       body: 'user 6 comments to group 1',
       users_id: 6,
       groups_id: 1 },
     { username: 'usersix',
       avatar_url: 'https://image.flaticon.com/icons/svg/145/145864.svg',
       id: 16,
       body: 'user 8 comments to group 1',
       users_id: 8,
       groups_id: 1 },
     { username: 'usersix',
       avatar_url: 'https://image.flaticon.com/icons/svg/145/145864.svg',
       id: 18,
       body: 'test\n',
       users_id: 8,
       groups_id: 1 },
     { username: 'usersix',
       avatar_url: 'https://image.flaticon.com/icons/svg/145/145864.svg',
       id: 19,
       body: 'another test',
       users_id: 8,
       groups_id: 1 } ],
  fields:
   [ Field {
       name: 'username',
       tableID: 31280,
       columnID: 2,
       dataTypeID: 1043,
       dataTypeSize: -1,
       dataTypeModifier: 259,
       format: 'text' },

所以在上面的数据中,这个请求来自 usersix,他只属于组 1。正如预期的那样,所有的 post 都有 groups_id =1,但是所有的 avatar_urls 和用户名一样。

最后,json 概述了 post 与用户之间的关系:

{
"id": 1,
"body": "user 1 comments to group 1",
"users_id": 1,
"created_at": null,
"updated_at": null,
"groups_id": 1,
"user": {
"id": 1,
"username": "userone",
"email": "userone@gmail.com",
"password": "a$tiTQXusc4msyM0/73YfZAensmiCEI3FrTjP/JLS9nRctnut9x7od.",
"created_at": null,
"updated_at": null,
"avatar_url": "https://image.flaticon.com/icons/svg/145/145867.svg",
"bio": "Lorem ipsum dolor amet vexillologist bitters pickled 90's put a bird on it mlkshk street art squid lyft butcher prism. Kombucha tousled chicharrones keytar semiotics flexitarian, pinterest copper mug asymmetrical VHS. Chartreuse vaporware copper mug raclette, PBR&B pinterest keytar farm-to-table bicycle rights pitchfork poke kogi. Cornhole flexitarian deep v, post-ironic art party artisan edison bulb etsy. Schlitz VHS shabby chic lomo.",
"location": "New York, NY"
}
},

我正在尝试弄清楚如何在联接中获取关联字段 table。

你的连接有问题:

SELECT
  users.username, users.avatar_url, posts.id, posts.body, posts.users_id, posts.groups_id
FROM
  posts
  INNER JOIN memberships ON posts.groups_id = memberships.groups_id
  JOIN users ON memberships.users_id = users.id
WHERE memberships.users_id = ${userId}

通过加入 usersmemberships 的关系,您实际上是在选择当前用户 - 与您使用 WHERE 子句筛选的用户相同。相反,您想通过作者列加入 users 反对 posts

SELECT
  users.username, users.avatar_url, posts.id, posts.body, posts.users_id, posts.groups_id
FROM
  posts
  INNER JOIN memberships ON posts.groups_id = memberships.groups_id
  JOIN users ON posts.users_id = users.id
--              ^^^^^
WHERE memberships.users_id = ${userId}