我有两张桌子。第一个名为“产品”,第二个名为“变体”。 “variants”表包含一个名为“product_id”的字段(它指向“products”表中的产品)和一个名为“price”的字段。
我正在使用 NodeJS 和 Sequelize 与 MySQL 数据库交互。我的目标是检索产品列表并根据“变体”表中的“价格”字段对其进行排序。然而,当我拿到产品清单时,却与我的预期不符。
我还实现了分页的限制和偏移。检查查询后,它会返回如下 SQL 查询:
SELECT `Product`.*,
`variants`.`id` AS `variants.id`,
`variants`.`price` AS `variants.price`
FROM
(SELECT `Product`.`id`,
`Product`.`title`,
`Product`.`image`,
`Product`.`view`,
`Product`.`status`,
`Product`.`created_at`
FROM `products` AS `Product`
WHERE `Product`.`status` != 'delete'
GROUP BY `id`
LIMIT 0,
10) AS `Product`
LEFT OUTER JOIN `variants` AS `variants` ON `Product`.`id` = `variants`.`product_id`
ORDER BY `variants`.`price` DESC;
我注意到,将限制设置为 10 个产品后,列表按价格排序,但它返回一个价格从 0 开始的列表,而不是像 1000 或 2000 这样的更高值。我想首先按价格对所有产品进行排序,然后取前 10 个。但是,我的代码似乎做了相反的事情。我该如何纠正这个问题?
这就是我所做的:
let query = {
attributes: ['id', 'title', 'image', 'view', 'status', 'created_at'],
where: {
status: {
[Op.ne]: 'delete'
}
},
include: {
model: Variants,
as: 'variants',
attributes: ['price'],
},
order: [[{ model: Variants, as: 'variants' }, 'price', 'DESC']],
group: 'id',
};
//other code
query.limit = payload.limit;
query.offset = payload.skip;
const products = await Product.findAll(query);
*您可以添加一个新的关键查询 - order = 'ASC', *如果您需要分页,您可以添加分页设置,例如通过添加默认分页添加限制和计数,因为 10 u 将实现您的输出