Mysql:哪些字段使用“匹配”;或;
我有一个疑问:Mysql:哪些字段使用“匹配”;或;,mysql,sql,node.js,Mysql,Sql,Node.js,我有一个疑问: SELECT * FROM accounts WHERE username = "aaa" OR email = "abc@example.com" OR mobile = "123456789" 我可以找到与以下字段匹配的字段: var username = req.body.username; var email = req.body.email; var mobile = req.body.mobile; database.query("SELECT * FROM ac
SELECT * FROM accounts WHERE username = "aaa" OR email = "abc@example.com" OR mobile = "123456789"
我可以找到与以下字段匹配的字段:
var username = req.body.username;
var email = req.body.email;
var mobile = req.body.mobile;
database.query("SELECT * FROM accounts WHERE username = ? OR email = ? OR mobile = ?",[username, email, mobile, (err, result)=>{
if (result.username == username) {...}
if (result.email == email) {...}
if (result.mobile == mobile) {...}
}
但是,我想知道哪一个字段在不多次使用
if
的情况下匹配(如果可能)。那么,这是Mysql中唯一可能的形式吗?无论哪个字段具有第一个匹配项,那么您的条件将变为真,它将返回结果。如果要匹配所有条件,则应使用和运算符您可以将其放入选择列表中。您可以使用CONCAT_WS()
将列列表合并为逗号分隔的列表。它将省略NULL
值,因此只列出匹配的字段
database.query(`SELECT *,
CONCAT_WS(',',
IF(username = ?, 'username', NULL),
IF(email = ?, 'email', NULL),
IF(mobile = ?, 'mobile', NULL)) AS matched_fields
FROM accounts WHERE username = ? OR email = ? OR mobile = ?`, [username, email, mobile, username, email, mobile], (err, result) => {
var matched = result.matched_fields.split(',');
matched.each(field => {
switch(field) {
case 'username': ...; break;
case 'email': ...; break;
case 'mobile': ...; break;
});
})
请尝试以下内容:-
SELECT * FROM accounts WHERE (username = "aaa" OR email = "abc@example.com" OR mobile = "123456789")
在select查询中创建自定义列,该自定义列具有三列(用户名、电子邮件、手机)匹配的case语句,并在该自定义列中打印相应的标志,让它知道行来自哪个条件。这不是问题所在。他想知道是哪个条件导致行匹配。我想到了这一点,但这与使用if()
(在我的代码中)没有什么不同。所以为了提高效率,是否可以将所有的“AS”放在一个数组中,作为数组返回,这样我就可以迭代它了?类似于AS matched[fieldname]
的内容,我已经对它进行了更新,以展示如何将它们全部放在一个列中。SQL没有数组,所以必须使用逗号分隔的字符串。