Node.js的mysql執行多表聯合查詢


數據庫(test)中的表結構(admin、user)

 

//執行多表結合查詢
var mysql = require('mysql');
var connection = mysql.createConnection({
    host : 'localhost',
    port : 3306,
    database : 'test',
    user : 'root',
    password : ''
})
connection.connect(function(err){
    if(err){
        console.log('與mysql數據庫建立連接失敗');
    }else{
        console.log('與mysql數據庫建立連接成功');
        connection.query('select admin.id,admin.username,admin.password,user.id,user.username from admin inner join user on admin.username = user.username',function(err,result){
            if(err){
                console.log('查詢數據失敗');
            }else{
                console.log('查詢數據成功');
                console.log(result);
                connection.end();
            }
        })
    }
})
//[{id:2,username:'kong',password:'123'}]
//注意:聯合查詢時,select + ...字段,如果字段名相同(雖然表名不同)會使后一個字段覆蓋前一個字段,產生我們不想要的結果
//以上例子admin表和user表的id、username字段由於名字相同,導致前面的被覆蓋,最后查詢出來的結果是user.id、user.username、admin.password
//使用*也會導致覆蓋問題

//解決辦法
//方案一(對重復的字段使用別名)
var mysql = require('mysql');
var connection = mysql.createConnection({
    host : 'localhost',
    port : 3306,
    database : 'test',
    user : 'root',
    password : ''
})
connection.connect(function(err){
    if(err){
        console.log('與mysql數據庫建立連接失敗');
    }else{
        console.log('與mysql數據庫建立連接成功');
        connection.query('select admin.id,admin.username,admin.password,user.id id1,user.username username1 from admin inner join user on admin.username = user.username',function(err,result){
            if(err){
                console.log('查詢數據失敗');
            }else{
                console.log('查詢數據成功');
                console.log(result);
                connection.end();
            }
        })
    }
})
//注意,select + ...字段使用了別名id1和username1
//[{id:1,username:'kong',password:'123',id1:2,username1:'kong'}]

//方案二(使用nestTables屬性並將屬性值設定為true)
var mysql = require('mysql');
var connection = mysql.createConnection({
    host : 'localhost',
    port : 3306,
    database : 'test',
    user : 'root',
    password : ''
})
connection.connect(function(err){
    if(err){
        console.log('與mysql數據庫建立連接失敗');
    }else{
        console.log('與mysql數據庫建立連接成功');
        connection.query({sql:'select admin.id,admin.username,admin.password,user.id,user.username from admin inner join user on admin.username = user.username',nestTables:true},function(err,result){
            if(err){
                console.log('查詢數據失敗');
            }else{
                console.log('查詢數據成功');
                console.log(result);
                connection.end();
            }
        })
    }
})
//注意和方案一查詢的數據格式不一樣
//[{admin:{id:1,username:'kong',password:'123'},user:{id:2,username:'kong'}}]

//方案三(使用nestTables屬性並將屬性值設定為一個分隔字符)
var mysql = require('mysql');
var connection = mysql.createConnection({
    host : 'localhost',
    port : 3306,
    database : 'test',
    user : 'root',
    password : ''
})
connection.connect(function(err){
    if(err){
        console.log('與mysql數據庫建立連接失敗');
    }else{
        console.log('與mysql數據庫建立連接成功');
        connection.query({sql:'select admin.id,admin.username,admin.password,user.id,user.username from admin inner join user on admin.username = user.username',nestTables:'_'},function(err,result){
            if(err){
                console.log('查詢數據失敗');
            }else{
                console.log('查詢數據成功');
                console.log(result);
                connection.end();
            }
        })
    }
})
//[{admin_id:1,admin_username:'kong',admin_password:'123',user_id:2,user_username:'kong'}]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM