1

所以这是我目前正在尝试模拟的 SQL。

SELECT * FROM direct_messages AS T
INNER JOIN (SELECT sender_id, receiver_id, MAX(sent_at) AS sent_at FROM direct_messages WHERE (sender_id = '2' OR sender_id = '3') AND (receiver_id = '3' OR receiver_id = '2') GROUP BY sender_id, receiver_id) A
ON A.sender_id = T.sender_id AND A.sent_at = T.sent_at;

这是表的实体

@ObjectType()
@Entity()
export class DirectMessages {
  @Field(() => ID)
  @PrimaryKey()
  id!: number;

  @Field(() => String)
  @Property()
  senderID!: string;

  @Field(() => String)
  @Property()
  receiverID!: string;

  @Field(() => String)
  @Property()
  message!: string;

  @Field(() => Date, { nullable: true })
  @Property({ nullable: true })
  readAt?: Date;

  @Field(() => Date)
  @Property()
  sentAt: Date = new Date();

  @Field(() => Date)
  @Property({ onUpdate: () => new Date() })
  updatedAt: Date = new Date();
}

到目前为止,这是我在 queryBuilder 中所写的

const subQuery = await er
      .createQueryBuilder('DirectMessages')
      .select(['sender_id', 'receiver_id', 'MAX(sent_at)'])
      .where({ $or: [{ senderID: '2' }, { senderID: '3' }] })
      .andWhere({ $or: [{ receiverID: '3' }, { receiverID: '2' }] })
      .groupBy(['sender_id', 'receiver_id'])
      .getKnexQuery();

    const queryResults = await er
      .createQueryBuilder('DirectMessages')
      .select('*')
      .withSubQuery(subQuery, 'A')
      .join('A.sender_id', 'T', undefined, 'innerJoin')
      .execute('all', true);

subQuery 是正确的,但我不知道如何将该临时表加入 DirectMessages 表。感谢您的帮助!

4

0 回答 0