javascript - 如何通过 3 个过滤器过滤?
问题描述
现在我有一个功能来识别用户输入了哪个过滤器。这是我当前代码的工作方式:
背景
- 目前我有 3 个空白,分别是festivalId、startTime和endTime。
- 用户可以选择通过 3 个空白中的任何一个进行过滤(意思是按festivalId、startTime 或 endTime 过滤)。
- 他们还可以选择按 2 个空格过滤(意思是按节日 ID 和 startTime 或节日 ID 和 endTime 过滤,但我当前的代码不支持按 startTime 和 endTime 过滤)
问题
- 所以目前,我想做的是我希望过滤 3 个空格(意思是按节日 ID、开始时间和结束时间过滤),也......
- 我想按 startTime 和 endTime 过滤,但我当前的代码不能这样做。
有人可以给我指导吗?我试图尝试它(这是我注释掉的代码),但它破坏了整个功能。
这是我当前的代码:
// retrieve data from PerformanceWithPopularity Table
function getPopularity(festivalId, startTime, endTime, page = 0, pageSize = 5, callback) {
let whereClause;
let i = 1;
const values = [];
if (!festivalId && !startTime && !endTime) { whereClause = '' }
// else if (!festivalId && startTime && endTime) {
// whereClause = 'WHERE'
// whereClause += `startTime >= $${i++} AND endTime < $${i++}`;
// values.push(parseInt(startTime));
// values.push(parseInt(endTime));
// }
else {
whereClause = 'WHERE'
if (festivalId) {
whereClause += ` festivalId = $${i++}`;
values.push(parseInt(festivalId));
}
if (startTime) {
whereClause += festivalId ? ` AND startTime >= $${i++}` : ` startTime >= $${i++}`;
values.push(parseInt(startTime));
}
if (endTime) {
whereClause += festivalId ? ` AND endTime < $${i++}` : ` endTime < $${i++}`;
values.push(parseInt(endTime));
}
// if (festivalId && startTime && endTime) {
// whereClause += `festivalId = $${i++} AND starTime >= $${i++} AND endTime < $${i++}`;
// values.push(parseInt(festivalId));
// values.push(parseInt(startTime));
// values.push(parseInt(endTime));
// }
}
let limitoffsetClause = `LIMIT $${i++} OFFSET $${i++}`
values.push(parseInt(pageSize)); //Limit = pageSize
values.push(parseInt(page) * parseInt(pageSize)); //offset = page * pageSize
const query = `SELECT * FROM PerformanceWithPopularity ${whereClause} ${limitoffsetClause}`;
const client = connect();
client.query(query, values, function (err, rows) {
console.log(query)
client.end();
callback(err, rows);
});
}
解决方案
我建议您开始过滤结果集,WHERE 1 = 1
以避免代码中不必要的条件。此外,查看您的代码,您可能会在查询中的关键字之间缺少一些空格。与其使用parseInt
您,不如尝试在变量前面加上+
符号,它还应该为您提供变量的数字表示。最后一件事,如果您在数据库中有startTime
并且endTime
在DateTime
数据库中,您可能需要获取参数DateTime
表示而不是其数值,但我假设您已经意识到这一点并且您将它作为数据库中的 Unix 时间戳。因此,请检查以下功能是否更好:
function getPopularity(festivalId, startTime, endTime, page = 0, pageSize = 5, callback) {
let query = 'SELECT * FROM PerformanceWithPopularity WHERE 1 = 1 ';
let ordinal = 1;
let parameters = [];
if (festivalId) {
query += ` AND festivalId = $${ordinal++} `;
parameters.push(+festivalId);
}
if (startTime) {
query += ` AND startTime >= $${ordinal++} `;
parameters.push(+startTime);
}
if (endTime) {
query += ` AND endTime <= $${ordinal++} `;
parameters.push(+endTime);
}
if (pageSize) {
query += ` LIMIT $${ordinal++} `;
parameters.push(+pageSize);
}
const offset = (+page) * (+pageSize);
if (offset) {
query += ` OFFSET $${ordinal++} `;
parameters.push(offset);
}
const client = connect();
client.query(query, parameters, function (err, rows) {
console.log(query);
client.end();
callback(err, rows);
});
}
推荐阅读
- spring-boot - 如何在另一个具有循环依赖的单声道中使用单声道
- python - 在 Pandas DataFrame 中转置选定的 MultiIndex 级别
- external - 如何将外部库添加到 Spree 扩展?
- javascript - 从范围内的数组中获取唯一值?
- excel - Removeduplicates 无法用于大小取决于数据范围的数组
- php - 使用 Carbon::now() 插入日期时间,但添加一个空属性 Laravel
- linux - Drupal 8:如何为节点使用私有文件系统
- spring-boot - Spring Boot:Kotlin 和 MongoRepository:执行全文搜索
- c - WiringPiISR 在每个引脚触发回调
- angular - 使用 IONIC 存储服务,如何获取和返回存储的 JSON 数据?