【问题标题】:Typeorm - using subqueriesTypeorm - 使用子查询
【发布时间】:2020-11-01 22:47:13
【问题描述】:

我的数据库中有 3 个实体,我们可以想象这 3 个(我只保留了重要的列)

User     

     @PrimaryColumn()
    nick: string

    @OneToMany(type => Connection, connection => connection.user)
    connections:Connection[] 

Connection 

    @PrimaryGeneratedColumn()
    id: number;

    @ManyToOne(type => User,user => user.connections) 
    user: User;

    @ManyToOne(type => Stream) 
    stream: Stream;

Stream
    @PrimaryGeneratedColumn()
    id: number;

我认为我有一些在 typeorm 中构建查询的技能,但我现在被困在使用子查询上。

我想做什么? 加入部分连接实体上的所有用户实体(选择几个连接实体作为子查询 => 制作 leftJoin 用户子查询 => 过滤结果以获取未找到右侧(连接)端的连接,因此连接 ID 为 NULL )。

我尝试了什么?

let query = await connectionRepository
.createQueryBuilder('connection')
.subQuery()
.where("connection.id = :id",{id:1})
.select(['connection.id','connection.user AS nick'])
.getQuery();

const result = await userRepository.createQueryBuilder("user")
                .leftJoinAndSelect("user.permissions", '(' + query + ')')
                .where("user.nick = :nick")
                .andWhere(`(${query}).id is null`)
                .getMany();

我也尝试使用不带 .getQuery() 的子查询,但无论如何它都不起作用,我认为我可以编写 Ok 子查询,但是在第二个查询中使用它时遇到问题(带有子查询属性等) 我也看过一些 lambda 函数的例子,但是 lambda 总是在 leftJoin 的第一位。

感谢您的回答:)

【问题讨论】:

  • 请用“人类语言”而不是 SQL 描述您希望实现的目标。您想获得什么样的数据?
  • 我想获取所有没有连接到特定流的用户。

标签: mysql typeorm


【解决方案1】:

你需要这样的东西:

const result = await userRepository.query(`
      SELECT user.* FROM user
      LEFT JOIN connection connection ON user.id = connection.user_id
      WHERE connection.user_id IS NULL
      AND connection.id = ?;
    `, [id])

相关问题:MYSQL Left Join how do I select NULL values?

【讨论】:

  • 不,你不能那样做,因为 where + andWhere 是在命令之后执行的,所以你没有任何带有 connection.user_id IS NULL 的行(我用测试数据尝试过,我得到了 [] ,但我应该得到 3 个用户)。唯一可行的方法是使用子查询,因为您只需要在部分连接实体上执行连接。
  • 你可以使用原始查询吗?
  • SELECT * FROM User LEFT JOIN (SELECT * FROM Connection WHERE stream = 5) AS Connection ON User.nick = Connection.user WHERE Con​​nection.id IS NULL;我不知道 Postgres 究竟是如何存储 ManyToOne 和 OneToMany 的,但我已经创建了试用 Postgres 模型,并且这个查询可以按我的意愿工作。
  • 我在我的项目中使用了我在答案中编写的查询,但作为原始 SQL 并且它有效。我猜它不适用于生成的查询,因为 FK 或类似的东西。有时原始是解决方案。
  • Tbh 我不知道原始查询的选项:D 我试过了,它现在可以工作了,谢谢你的提示和帮助 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 2022-01-06
  • 2022-01-04
  • 1970-01-01
  • 2021-01-29
相关资源
最近更新 更多