Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
针对1-n关系的MySQL n部分查询_Mysql_Node.js - Fatal编程技术网

针对1-n关系的MySQL n部分查询

针对1-n关系的MySQL n部分查询,mysql,node.js,Mysql,Node.js,(几天前刚开始学习SQL,如果这是一个愚蠢的问题,那么很抱歉!) 我有三个表:用户、地址和地址类别。每个用户有多个地址,但每个地址类别不超过1个地址。我想做一个查询,根据每个AddressCategory的不同条件搜索用户 表结构如下所示: 用户: id 1 2 地址类别: category HomeAddress WorkAddress 地址: userId category address 1 HomeAddress 1 Washington Street 1

(几天前刚开始学习SQL,如果这是一个愚蠢的问题,那么很抱歉!)

我有三个表:用户、地址和地址类别。每个用户有多个地址,但每个地址类别不超过1个地址。我想做一个查询,根据每个AddressCategory的不同条件搜索用户

表结构如下所示:

用户:

id
1
2
地址类别:

category
HomeAddress
WorkAddress
地址:

userId   category     address
1        HomeAddress  1 Washington Street
1        WorkAddress  53 Elm Avenue
2        HomeAddress  7 Bernard Street
假设我想搜索家庭地址包含单词“Street”和工作地址包含单词“Avenue”的所有用户。我可以使用以下查询:

从用户中选择*
用户上的内部联接地址a1.id=a1.userId
用户上的内部联接地址a2.id=a2.userId
其中a1.category='HomeAddress'和a1.address,如'%Street%'
以及a2.category='WorkAddress'和a2.address,如'%Avenue%'
如果我想跨任意数量的AddressCategories进行查询,我可以使用上述相同的原则动态构建查询:

// dictionary of query parts
var q_parts = {HomeAddress: 'Street',
                WorkAddress: 'Avenue'
                ...}

// build the query string piece by piece
let q_str1="", q_str2="";
let i=0;
for (q in q_parts) {
    i++;
    q_str1 += "INNER JOIN Addresses a${i} ON Users.id=a${1}.userId ";
    q_str2 += (i==1) ? "WHERE " : "AND ";
    q_str2 += "a${i}.category='${q}' AND a${i}.address LIKE '%${q_parts[q]}%' ";
}

// complete query string
let q_str = "SELECT * FROM Users "+q_str1+q_str2;

我现在这样做是可行的,但是构建查询字符串很容易出错,随着类别数量的增加,最终的字符串很快变得庞大。看来一定有更好的办法。在MySQL中执行此类查询的正确方法是什么?(或者我如何组织我的表有问题吗?

您可以使用此表进行查询生成。
官方网站:
Npm链接:

的示例SQL不必多次加入。它没有经过测试,只是一个想法。 您可以在
Where子句中使用
When/then
逐案验证。最后,根据用户的总类别进行筛选(分组依据)

SELECT *
FROM
Users Inner Join
  (SELECT userId,
          count(category) AS categoryCount
   WHERE address LIKE '%Street%' LIKE CASE
                                          WHEN category = 'HomeAddress' THEN '%Street%'
                                          WHEN category = 'WorkAddress' THEN '%Avenue%'
                                      END
   GROUP BY userId) a ON Users.id = a.userId 
WHERE categoryCount = ? -- inject your count of all categories here, maybe get from another query