让我在序言中说我对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);
简明问题:
让我在序言中说我对SQL(和后端设计)一般来说是新手。因此,对于那些对新手问题感到恼火的人,请保持温柔。背景:我正在尝试建立产品测试数据库(...
一个选项是使用coalesce()
: