【发布时间】:2019-10-19 18:44:49
【问题描述】:
(几天前刚开始学习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”的所有用户。我可以使用查询:
SELECT * FROM Users
INNER JOIN Addresses a1 ON Users.id=a1.userId
INNER JOIN Addresses a2 ON Users.id=a2.userId
WHERE a1.category='HomeAddress' AND a1.address LIKE '%Street%'
AND a2.category='WorkAddress' AND a2.address LIKE '%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 中执行此类查询的正确方法是什么? (或者我的表格组织方式有问题吗?)
【问题讨论】: