Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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
Mysql:哪些字段使用“匹配”;或;_Mysql_Sql_Node.js - Fatal编程技术网

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没有数组,所以必须使用逗号分隔的字符串。