使用mysql和node.js进行多参数搜索

使用mysql和node.js进行多参数搜索,mysql,sql,node.js,search,where-clause,Mysql,Sql,Node.js,Search,Where Clause,让我先说一下,一般来说,我对SQL(和后端设计)非常陌生。所以,对于那些被noob问题困扰的人,请温柔一点 背景: 我正在尝试建立一个产品测试数据库(存储我们所有产品的测试数据),我希望用户能够改进搜索,找到他们真正想要的测试数据。例如,他们可能首先搜索某个品牌的所有产品,然后使用产品类型对其进行优化,和/或使用测试完成的日期范围对其进行优化 问题: 我很难找到关于如何使用mysql和node.js实现多参数搜索的信息。我知道可以在纯SQL语法中执行嵌套查询和连接等操作,但我不太清楚如何从nod

让我先说一下,一般来说,我对SQL(和后端设计)非常陌生。所以,对于那些被noob问题困扰的人,请温柔一点

背景:

我正在尝试建立一个产品测试数据库(存储我们所有产品的测试数据),我希望用户能够改进搜索,找到他们真正想要的测试数据。例如,他们可能首先搜索某个品牌的所有产品,然后使用产品类型对其进行优化,和/或使用测试完成的日期范围对其进行优化

问题:

我很难找到关于如何使用mysql和node.js实现多参数搜索的信息。我知道可以在纯SQL语法中执行嵌套查询和连接等操作,但我不太清楚如何从node.js执行这些操作,特别是当某些搜索条件不能保证使用时。

例:

我知道如何将数据从node.js传递到这个过程,但是如果用户没有指定产品类型呢?有没有办法取消查询的这一部分?比如:
和产品类型=全部

我所尝试的:

我还研究了嵌套多个SQL过程,但是将动态数据传递到“FROM”子句似乎是不可能的。例如:如果我有一个brandname过程和一个product type过程,我不知道如何/是否可以将一个过程的结果传递到另一个过程的“from”子句,以实际优化搜索

一个想法是在每个过程中创建带有结果的表,并将这些新表名传递给后续过程,但我觉得这样做效率低下(我错了吗?这是完全合法的方法吗?)

我还研究了在节点端构建一个查询字符串,该字符串将智能地决定前端指定了哪些搜索条件,并找出将SQL和JOIN放在何处,以及将哪些放在何处。下面的示例实际上是有效的,但随着我添加更多的搜索条件以及与其他表的连接,它可能会变得很快

// Build a SQL query based on the parameters in a request URL
// Example request URL: http://localhost:3000/search?brand=brandName&type=productType
function qParams(req) {
    let q = "SELECT * FROM products WHERE ";
    let insert = [];
    if(req.query.brand) {
        brandname = req.query.brand; // get brandname from url request
        q = q + `brand = ?`, // Build brandname part of WHERE clause
        insert.push(brandname); // Add brandname to insert array to be used with query.
    };
    if(req.query.type) {
        productType = req.query.type; // get product type from url request
        insert.length > 0 ? q = q + ' AND ' : q = q; // Decide if this is the first search criteria, add AND if not.
        q = q + 'product_type = ?'; // Add product_type to WHERE clause
        insert.push(productType); // Add product_type variable to insert array.
    }
    // Return query string and variable insert array
    return {
        q: q, 
        insert: insert
    };
};

// Send Query
async function qSend(req, res) {
    const results = await qParams(req); // Call above function, wait for results

    // Send query string and variables to MySQL, send response to browser.
    con.query(results.q, results.insert, (err, rows) => {
        if(err) throw err;
        res.send(rows);
        res.end;
    })
};

// Handle GET request
router.use('/search', qSend);
简明问题:

  • 我是否可以使用所有搜索条件作为变量构建一个SQL过程,并在不使用某些条件的情况下从node.js中取消这些变量
  • 有没有办法嵌套多个MySQL过程,以便我可以选择适用于搜索条件的过程?
    • 在过程中创建结果表,并将这些新表名传递给其他过程,这是一种合理的方法吗
  • 在节点中从头开始构建查询是可行的,但它似乎有些臃肿。有更好的方法吗
  • 谷歌搜索“多参数搜索mysql nodejs”并没有为我的问题产生有用的结果,也就是说,我问的问题不对。什么是正确的问题?我需要研究什么

一个选项是使用
coalesce()

对参数执行显式
null
检查可能更有效:

    SELECT p.* 
FROM products p
WHERE 
    (:brandname IS NULL OR p.brand = :brandname)
    AND (:producttype IS NULL OR p.product_type = :producttype);

这完全回答了我的第一个问题。我可以有一个SQL过程,它处理空值。在node.js中,我的查询函数现在看起来像:
函数qSend(req,res){const brand=req.query.brand?req.query.brand:null;const type=req.query.type?req.query.type:null;const q=“CALL procedureName(?);console.log(brand)(con,[brand,type],(err,rows)=>{res send(rows);});res.end}
SELECT p.* 
FROM products p
WHERE 
    p.brand = COALESCE(:brandname, p.brand)
    AND p.product_type = COALESCE(:producttype, p.producttype);
    SELECT p.* 
FROM products p
WHERE 
    (:brandname IS NULL OR p.brand = :brandname)
    AND (:producttype IS NULL OR p.product_type = :producttype);