Knex 使用自连接、内连接等连接多个表

Knex joining multiple tables with self joins, inner joins etc

我已经为这个 join tangle 苦苦挣扎了一天,我相信寻求专业人士的帮助是更明智的做法:) 感谢您对我的耐心等待。

我有 5 个表需要连接、左连接、内连接、自连接,谁知道呢。我正在使用 Knex 和 Postgres。

食谱

id SERIAL PRIMARY KEY
user_id integer NOT NULL REFERENCES users(id)
title text
description text 
etc...

用户

id SERIAL PRIMARY KEY
username character varying(100) NOT NULL UNIQUE
etc...

评论 - 包含关于哪个用户评论过菜谱、谁是评论和菜谱作者的信息

id SERIAL PRIMARY KEY
user_id integer NOT NULL REFERENCES users(id)
author_id integer NOT NULL REFERENCES users(id)
recipe_id integer REFERENCES recipes(id)
etc...

关注 - 保存有关哪个用户关注谁的信息

id SERIAL PRIMARY KEY
user_id integer NOT NULL REFERENCES users(id)
chef_id integer NOT NULL REFERENCES users(id)

Review_votes - 保存有关谁对菜谱评论投赞成票或反对票的信息

id SERIAL PRIMARY KEY
user_id integer NOT NULL REFERENCES users(id)
author_id integer NOT NULL REFERENCES users(id)
review_id integer NOT NULL REFERENCES reviews(id)
recipe_id integer NOT NULL REFERENCES recipes(id)
vote integer CHECK (vote = ANY (ARRAY[1, 0, - 1]))

我想要的是获取一个recipe_id

的所有评论相关数据和评论者相关数据
  1. 来自评论的评论数据
  2. 来自用户的评论者数据
  3. 评论者将评论列表创建为来自评论的数组
  4. 审阅者将食谱列表创建为来自食谱的数组
  5. 评论者关注者列表为以下数组
  6. 审核来自 review_votes 的投票总和

我想要一切,现在从一个查询,典型的女人... 看起来不是什么大麻烦,但不知何故我似乎失败了。

到目前为止我尝试了什么:

const userRef = database.ref('reviews.user_id');
const reviewRef = database.ref('reviews.id');
const reviewed = database('reviews').where('reviews.user_id', userRef).count('id as reviewed').as('reviewed');
const liked = database('review_votes').where('review_votes.review_id', reviewRef).sum('vote').as('liked')

const reviews = await database('reviews')
  .rightJoin('users', 'users.id', 'reviews.user_id')
  .leftJoin('followings', 'followings.chef', userRef)
  .leftJoin('recipes', 'recipes.user_id', userRef)
  .select({
    username: 'users.username',
    review_pic: 'reviews.review_pic',
    user_pic: 'users.user_pic',
    id: 'reviews.id',
    user_id: 'reviews.user_id',
    author_id: 'reviews.author_id',
    text: 'reviews.text',
    recipe_id: 'reviews.recipe_id',
  },
    reviewed,
    liked
  )
  .count({ followers_count: 'followings.id' })
  .count({ created_recipes: 'recipes.id' })
  .where('reviews.recipe_id', +recipe_id)
  .groupBy(
    'followings.chef',
    'recipes.user_id',
    'reviews.id',
    'users.id',
  );

它几乎可以工作,除了评论的子查询给我所有的评论计数,而不是特定评论者的计数。

有什么想法可以解决这个问题吗?重新排列表格?使用 array_agg?停止编程并开始养羊之类的?谢谢! :)

经过深思熟虑并在同事的帮助下,我们将查询拆分为更多子查询,并修复了 reviewed 子查询 .where() 中的拼写错误。 如果有人关心的话,正确的查询是这样的:)

const userRef = database.ref('reviews.user_id');
const reviewRef = database.ref('reviews.id');

const reviewed = database('reviews AS reviewed').where('reviewed.user_id', userRef).count('id as reviewed').as('reviewed');
const liked = database('review_votes').where('review_votes.review_id', reviewRef).sum('vote').as('liked');
const followers_count = database('followings').where('followings.chef', userRef).count('*').as('followers_count');
const created_recipes = database('recipes').where('recipes.user_id', userRef).count('*').as('created_recipes');

const reviews = await database('reviews')
  .rightJoin('users', 'users.id', 'reviews.user_id')
  .select({
    username: 'users.username',
    review_pic: 'reviews.review_pic',
    user_pic: 'users.user_pic',
    id: 'reviews.id',
    user_id: 'reviews.user_id',
    author_id: 'reviews.author_id',
    text: 'reviews.text',
    recipe_id: 'reviews.recipe_id',
  },
    reviewed,
    liked,
    followers_count,
    created_recipes,
  )
  .where('reviews.recipe_id', +recipe_id)
  .groupBy(
    'reviews.id',
    'users.id',
  );