所以这是我目前正在尝试模拟的 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 表。感谢您的帮助!