Tôi không nghĩ rằng một câu trả lời rõ ràng cho câu hỏi của bạn là có thể. Xem # 1869 :
Để trả lời câu hỏi tiêu đề, Sequelize sẽ tự động tạo một truy vấn con (ví dụ: # 1719 ), nhưng bạn không thể thực hiện một truy vấn con tùy chỉnh. Tôi không có tham chiếu có thẩm quyền cho một phủ định.
Có vẻ như bảng của bạn giống như sau:
EssayStats
EssayId
EssayDate
WordCount
Sau đó, bạn có thể làm điều gì đó như sau:
return EssayStat.findAll({
attributes: [
[sequelize.literal('((SELECT wordCount FROM "EssayStats" WHERE "EssayId" = "EssayStat"."EssayId" EssayStat BY "createdAt" DESC LIMIT 1) - (SELECT wordCount FROM "EssayStats" WHERE "EssayId" = "EssayStat"."EssayId" EssayStat BY "createdAt" ASC LIMIT 1))'), 'difference'],
'EssayId'
],
group: ['EssayId']
});
Tất cả những gì nó đang làm là chạy hai truy vấn CHỌN, lấy MAX và MIN từ các truy vấn đó sau khi sắp xếp theo biến quan tâm của bạn, sau đó lấy chênh lệch của bạn. Điều đó sẽ cung cấp cho bạn những gì bạn quan tâm:sự khác biệt về số lượng từ giữa phiên bản gần đây nhất và phiên bản đầu tiên.
Mẹo ở đây là đóng gói một câu lệnh SELECT trong một trường thuộc tính.
Tất nhiên, nó lộn xộn và có lẽ không tốt hơn nhiều so với sequelize.query
đóng hộp . Nhưng nó trả lời ý chính của câu hỏi của bạn.
Một giải pháp tốt hơn có thể là không chuẩn hóa một số dữ liệu của bạn và lưu trữ trực tiếp "wordCountDelta" trong mô hình Bài luận của bạn. Sau đó, bạn có thể có một afterCreate
hook
để tự động cập nhật trường. Đó cũng rất có thể là giải pháp nhanh nhất.
Tôi đã trả lời điều gì đó tương tự tại đây .