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
的所有评论相关数据和评论者相关数据
- 来自评论的评论数据
- 来自用户的评论者数据
- 评论者将评论列表创建为来自评论的数组
- 审阅者将食谱列表创建为来自食谱的数组
- 评论者关注者列表为以下数组
- 审核来自 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',
);
我已经为这个 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
的所有评论相关数据和评论者相关数据- 来自评论的评论数据
- 来自用户的评论者数据
- 评论者将评论列表创建为来自评论的数组
- 审阅者将食谱列表创建为来自食谱的数组
- 评论者关注者列表为以下数组
- 审核来自 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',
);