gpt4 book ai didi

node.js - 从jeft连接查询TypeORM中选择特定的列

转载 作者:行者123 更新时间:2023-12-03 12:15:11 31 4
gpt4 key购买 nike

我的任务是获取有关数据库中用户的关键信息。有许多left joins,查询工作相当缓慢。
我试图以某种方式对其进行优化,因此我决定仅选择特定字段(当前仅记录的ID)。

这是我查询的一部分。我只需要获取属于用户的每个事件的ID,并对数据库中的每个用户执行相同的操作。理想情况下,我应该获取ID数组。

我试图建立一个子查询,但是找不到解释的例子。官方文档中的一个例子对我来说还不够。

当我运行它时,我得到了错误

syntax error at or near "SELECT"
QueryFailedError: syntax error at or near "SELECT"
this.createQueryBuilder('profile')
.leftJoinAndSelect('profile.avatarPhoto', 'avatarPhoto')
.leftJoinAndSelect('profile.coverPhoto', 'coverPhoto')
.leftJoinAndSelect('profile.primaryCountry', 'country')
.leftJoinAndSelect('profile.primaryCity', 'city')
.leftJoinAndSelect('profile.images', 'image')
.leftJoinAndSelect('profile.practicedSports', 'practicedSport')
.leftJoinAndSelect(
(subQuery) =>
subQuery
.subQuery()
.createQueryBuilder()
.select(['id'])
.leftJoin('user', 'user')
.from(SportEvent, 'event'),
'event',
'event.user.id = profile.id',
)
// .leftJoinAndSelect('profile.sportServices', 'service')
// .leftJoinAndSelect('profile.lessons', 'lesson')
// .leftJoinAndSelect('profile.activityRequests', 'request')
.leftJoin('profile.userAuth', 'auth')
.where('auth.registered = true')
.andWhere('auth.blocked = false')
.take(params.pageSize)
.skip(itemsNumber)
.getMany()

这是生成的SQL代码
SELECT DISTINCT "distinctAlias"."profile_id" as "ids_profile_id" 
FROM (SELECT "profile"."id" AS "profile_id", "profile"."email" AS "profile_email",
"profile"."first_name" AS "profile_first_name",
"profile"."middle_name" AS "profile_middle_name",
"profile"."last_name" AS "profile_last_name",
"profile"."about_user" AS "profile_about_user",
"profile"."interests" AS "profile_interests",
"profile"."birthday" AS "profile_birthday",
"profile"."gender" AS "profile_gender",
"profile"."sport_level" AS "profile_sport_level",
"profile"."phone_number" AS "profile_phone_number",
"profile"."contacts" AS "profile_contacts",
"profile"."payment_methods" AS "profile_payment_methods",
"profile"."settings" AS "profile_settings",
"profile"."options" AS "profile_options",
"profile"."updated_at" AS "profile_updated_at",
"profile"."created_at" AS "profile_created_at",
"profile"."avatar_photo_id" AS "profile_avatar_photo_id",
"profile"."cover_photo_id" AS "profile_cover_photo_id",
"profile"."cover_video_id" AS "profile_cover_video_id",
"profile"."default_album_id" AS "profile_default_album_id",
"profile"."primary_country_id" AS "profile_primary_country_id",
"profile"."primary_city_id" AS "profile_primary_city_id",
"profile"."primary_language_id" AS "profile_primary_language_id",
"avatarPhoto"."id" AS "avatarPhoto_id",
"avatarPhoto"."name" AS "avatarPhoto_name",
"avatarPhoto"."image_paths" AS "avatarPhoto_image_paths",
"avatarPhoto"."updated_at" AS "avatarPhoto_updated_at",
"avatarPhoto"."created_at" AS "avatarPhoto_created_at",
"avatarPhoto"."album_id" AS "avatarPhoto_album_id",
"avatarPhoto"."user_id" AS "avatarPhoto_user_id",
"coverPhoto"."id" AS "coverPhoto_id",
"coverPhoto"."name" AS "coverPhoto_name",
"coverPhoto"."image_paths" AS "coverPhoto_image_paths",
"coverPhoto"."updated_at" AS "coverPhoto_updated_at",
"coverPhoto"."created_at" AS "coverPhoto_created_at",
"coverPhoto"."album_id" AS "coverPhoto_album_id",
"coverPhoto"."user_id" AS "coverPhoto_user_id",
"country"."id" AS "country_id",
"country"."name" AS "country_name",
"country"."alpha_2" AS "country_alpha_2",
"country"."alpha_3" AS "country_alpha_3",
"country"."calling_code" AS "country_calling_code",
"country"."enabled" AS "country_enabled",
"country"."top" AS "country_top", "city"."id" AS "city_id",
"city"."name" AS "city_name",
"city"."coordinates" AS "city_coordinates",
"city"."top" AS "city_top",
"city"."country_id" AS "city_country_id",
"image"."id" AS "image_id",
"image"."name" AS "image_name",
"image"."image_paths" AS "image_image_paths",
"image"."updated_at" AS "image_updated_at",
"image"."created_at" AS "image_created_at",
"image"."album_id" AS "image_album_id",
"image"."user_id" AS "image_user_id",
"practicedSport"."id" AS "practicedSport_id",
"practicedSport"."start_date" AS "practicedSport_start_date",
"practicedSport"."sport_id" AS "practicedSport_sport_id",
"practicedSport"."user_id" AS "practicedSport_user_id",
"event".*
FROM "user_profiles" "profile" LEFT JOIN "media_images" "avatarPhoto"
ON "avatarPhoto"."id"="profile"."avatar_photo_id" LEFT JOIN "media_images" "coverPhoto"
ON "coverPhoto"."id"="profile"."cover_photo_id" LEFT JOIN "data_countries" "country"
ON "country"."id"="profile"."primary_country_id" LEFT JOIN "data_cities" "city"
ON "city"."id"="profile"."primary_city_id" LEFT JOIN "media_images" "image"
ON "image"."user_id"="profile"."id" LEFT JOIN "user_practiced_sports" "practicedSport"
ON "practicedSport"."user_id"="profile"."id"
LEFT JOIN SELECT id FROM "sport_events" "event"
LEFT JOIN "user" "user" "event"
ON event.user.id = "profile"."id"
LEFT JOIN "user_auth" "auth"
ON "auth"."profile_id"="profile"."id"
WHERE "auth"."registered" = true
AND auth.blocked = false) "distinctAlias"
ORDER BY "profile_id" ASC LIMIT 15


您能解释我做错了什么吗,还是给我发一篇带有解释的文章?
谢谢!

最佳答案

我认为不可能加入event.user.id,您应该将其分成两个leftJoins。还要确保使用leftJoin(..)(然后通过.select(..).addSelect(..)指定要选择的字段)而不是leftJoinAndSelect(..),因为这会自动选择所有字段。

关于node.js - 从jeft连接查询TypeORM中选择特定的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62390886/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com