这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战
排序和分组
order
and group
参数,与 ORDER BY
和 GROUP BY
可以一起使用
order
参数用来让 sequelize 方法对查询进行排序. 这些列本身是 [column, direction]
形式的数组(如 ASC
, DESC
, NULLS FIRST
等)
Subtask.findAll({
order: [
// 将转义 title 并针对有效方向列表进行降序排列
['title', 'DESC'],
// 将按最大年龄进行升序排序
sequelize.fn('max', sequelize.col('age')),
// 将按最大年龄进行降序排序
[sequelize.fn('max', sequelize.col('age')), 'DESC'],
// 将按 otherfunction(`col1`, 12, 'lalala') 进行降序排序
[sequelize.fn('otherfunction', sequelize.col('col1'), 12, 'lalala'), 'DESC'],
// 将使用模型名称作为关联名称按关联模型的 createdAt 排序.
[Task, 'createdAt', 'DESC'],
// 将使用模型名称作为关联名称通过关联模型的 createdAt 排序.
[Task, Project, 'createdAt', 'DESC'],
// 将使用关联名称按关联模型的 createdAt 排序.
['Task', 'createdAt', 'DESC'],
// 将使用关联的名称按嵌套的关联模型的 createdAt 排序.
['Task', 'Project', 'createdAt', 'DESC'],
// 将使用关联对象按关联模型的 createdAt 排序. (首选方法)
[Subtask.associations.Task, 'createdAt', 'DESC'],
// 将使用关联对象按嵌套关联模型的 createdAt 排序. (首选方法)
[Subtask.associations.Task, Task.associations.Project, 'createdAt', 'DESC'],
// 将使用简单的关联对象按关联模型的 createdAt 排序.
[{model: Task, as: 'Task'}, 'createdAt', 'DESC'],
// 将由嵌套关联模型的 createdAt 简单关联对象排序.
[{model: Task, as: 'Task'}, {model: Project, as: 'Project'}, 'createdAt', 'DESC']
],
// 将按最大年龄降序排列
order: sequelize.literal('max(age) DESC'),
// 如果忽略方向,则默认升序,将按最大年龄升序排序
order: sequelize.fn('max', sequelize.col('age')),
// 如果省略方向,则默认升序, 将按年龄升序排列
order: sequelize.col('age'),
// 将根据方言随机排序(但不是 fn('RAND') 或 fn('RANDOM'))
order: sequelize.random()
});
Foo.findOne({
order: [
// 将返回 `name`
['name'],
// 将返回 `username` DESC
['username', 'DESC'],
// 将返回 max(`age`)
sequelize.fn('max', sequelize.col('age')),
// 将返回 max(`age`) DESC
[sequelize.fn('max', sequelize.col('age')), 'DESC'],
// 将返回 otherfunction(`col1`, 12, 'lalala') DESC
[sequelize.fn('otherfunction', sequelize.col('col1'), 12, 'lalala'), 'DESC'],
// 将返回 otherfunction(awesomefunction(`col`)) DESC, 这种嵌套可能是无限的!
[sequelize.fn('otherfunction', sequelize.fn('awesomefunction', sequelize.col('col'))), 'DESC']
]
});
order
数组的元素可以如下:
-
一个字符串 (它将被自动引用)
-
一个数组, 其第一个元素将被引用,第二个将被逐字追加
-
一个具有
raw
字段的对象:raw
内容将不加引用地逐字添加- 其他所有内容都将被忽略,如果未设置
raw
,查询将失败
-
调用
Sequelize.fn
(这将在 SQL 中生成一个函数调用) -
调用
Sequelize.col
(这将引用列名)
分组
分组和排序的语法相同,只是分组不接受排列顺序作为数组的最后一个参数(不存在 ASC
, DESC
, NULLS FIRST
等),将字符串直接传递给 group
User.findAll({ group: 'name' });
// 生成 'GROUP BY name'
限制和分页
limit
和 offset
参数可以进行 限制/分页,一般和 order
参数一起使用.
// 提取10个实例/行
User.findAll({ limit: 10 });
// 跳过8个实例/行
User.findAll({ offset: 8 });
// 跳过5个实例,然后获取5个实例
User.findAll({ offset: 5, limit: 5 });