我已经为这一纠缠而挣扎了一天,我相信寻求专业人士的帮助是比较明智的:)谢谢您对我的耐心。
我有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]))
我想要的是获取一个食谱ID的所有与评论相关的数据和与评论者相关的数据
我想要一切,现在从一个查询中,典型的女人... 似乎并没有什么大麻烦,但我似乎还是以失败告终。
到目前为止我已经尝试过:
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吗?停止编程并开始种羊吗?谢谢! :)
答案 0 :(得分:0)
经过深思熟虑并在同事的帮助下,我们将查询拆分为更多子查询,并修复了$
子查询reviewed
中的错字。
正确的查询是这样,如果有人在乎:)
.where()