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

问题描述 投票:0回答:1

让我在序言中说我对SQL(和后端设计)一般来说是新手。因此,对于那些因菜鸟问题而烦恼的人,请保持温柔。

背景:

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

问题:

我很难找到有关如何使用mysql和node.js进行多参数搜索的信息。我知道您可以在纯SQL语法内进行嵌套查询和联接等,但是它并不丰富对我清楚,我将如何从node.js中做到这一点,尤其是当不能保证使用某些搜索条件时。

Ex:

CREATE PROCEDURE `procedureName`(
    IN brandname VARCHAR(20),
       producttype VARCHAR(30))
BEGIN
    SELECT * FROM products
    WHERE brand = brandname
    AND product_type = producttype;
END

我知道如何将数据从node.js传递到此过程,但是如果用户未指定产品类型怎么办?有没有办法使查询的这一部分无效?就像是:AND product_type = ALL;

我尝试过的内容:

我还研究了嵌套多个SQL过程,但是似乎无法将动态数据传递给“ FROM”子句。例如:如果我有一个商标过程和一个产品类型过程,我不知道如何/是否可以将结果从一个过程传递给另一个过程的“ FROM”子句,以实际优化搜索。

一个想法是用这些过程中的每个过程的结果创建表,并将这些新表名传递给后续过程,但这使我感到效率低下(这样做是对的吗?这是完全合法的方法吗?这样吗?)。

我也在研究在节点侧构建查询字符串,该字符串将智能地确定前端已指定了哪些搜索条件,并弄清楚将SQL AND和JOIN和what-nots放在哪里。下面的示例实际上有效,但是当我添加更多搜索条件以及将JOINS添加到其他表时,这看起来可能很快变得很难看。

// 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);

简明问题:

  • 我可以使用所有搜索条件作为变量来构建1个SQL过程,如果不使用某些条件,可以从node.js中使这些变量无效?
  • 是否可以嵌套多个MySQL过程,以便我可以选择适用于搜索条件的过程?
    • 在过程中创建结果表,并将这些新表名传递给其他过程是这样做的合理方法吗?
  • 正在从头开始在节点中构建查询,但是看起来很肿。有更好的方法吗?
  • 谷歌搜索“多参数搜索mysql nodejs”不能为我的问题产生有用的结果,即我没有问正确的问题。正确的问题是什么?
  • 我需要研究什么?

    让我在序言中说我对SQL(和后端设计)一般来说是新手。因此,对于那些对新手问题感到恼火的人,请保持温柔。背景:我正在尝试建立产品测试数据库(...

    mysql sql node.js search where-clause
    1个回答
    0
    投票

    一个选项是使用coalesce()

    © www.soinside.com 2019 - 2024. All rights reserved.