2017-02-07 38 views
0

當我運行這段代碼時,daysFinalarr顯示爲[undefined,undefined,undefined,undefined,......,undefined]; 現在,我不知道爲什麼會發生這種情況? mysql語句有什麼問題? 請指教!爲什麼isnt mysql SELECT語句在我使用UNION ALL nodejs時運行,mysql

我剛剛記錄了行,它似乎只是從第一個SELECT語句中取回值,並且在語句的UNION ALL部分之後沒有得到任何東西。似乎這就是這裏出了什麼問題。那麼,爲什麼第二個SELECT語句沒有工作? UNION ALL語句之後的部分?

var rowsNumber; 
app.get('/final',function(req,res){ 
    connection.query('SELECT name,designation,salary,wages_rate FROM employee_details UNION ALL SELECT uan,da,days_present,total_wages FROM attendance_details',function(err,rows){ 
    if(err){ 
     console.error('MySQL — Error connecting: ' + err.stack); 
    }else{ 
     rowsNumber = rows.length; 

    var nameFinal; 
    var designationFinal; 
    var salaryFinal; 
    var wagesrateFinal; 
    var uanFinal; 
    var daFinal; 
    var daysFinal; 
    var totalwagesFinal; 
    var nameFinalarr = []; 
    var designationFinalarr =[]; 
    var salaryFinalarr = []; 
    var wagesrateFinalarr =[]; 
    var uanFinalarr =[]; 
    var daFinalarr =[]; 
    var daysFinalarr = []; 
    var totalwagesFinalarr =[]; 



    for(var i=0;i<rowsNumber;i++){ 
     nameFinalarr.push(rows[i].name); 
     designationFinalarr.push(rows[i].designation); 
     salaryFinalarr.push(rows[i].salary); 
     wagesrateFinalarr.push(rows[i].wages_rate); 
     uanFinalarr.push(rows[i].uan); 
     daysFinalarr.push(rows[i].da); 
     daysFinalarr.push(rows[i].days_present); 
     totalwagesFinalarr.push(rows[i].total_wages); 

    } 
     console.log('nameFinal is :', nameFinalarr); 
     console.log('daysFinalarr is :', daysFinalarr); 
    } 

    res.render('final',{rows:rowsNumber,name:nameFinal,designation:designationFinal,salary:salaryFinal,wagesrate:wagesrateFinal,uan:uanFinal,da:daFinal, 
     days:daysFinal, 
     totalwages:totalwagesFinal}); 
    }); 

}); 
+0

你確定'rows [i] .days_present'沒有定義嗎? – Jackowski

+0

是的,我很確定。 days_present是數據庫表attendance_details中的一列。 你爲什麼認爲這應該是未定義的? – faraz

+0

不知道這是否適用於'UNION',但默認情況下,'mysql'不允許多個語句查詢。見[this](https://github.com/mysqljs/mysql#multiple-statement-queries)。 – robertklep

回答

1

在我看來,所有這些值都是未定義的。要麼你沒有正確查詢你的數據庫(檢查你的SQL語句),或者它返回rows的地方,你期望的JSON模式不匹配。

首先,嘗試記錄rows以查看實際回收的內容 - 這應清楚地標識您的SQL查詢中是否存在問題。

接下來,您可以清理和改善你的代碼頗有幾分這裏:

  1. 不要定義rowsNumber外路線的;每次請求到達服務器時它都會被破壞。
  2. nameFinal永遠不會被設置。它有什麼作用?
  3. ,而不是使用迭代器來forEach解析查詢結果:

    rows.forEach(row) { 
        nameFinalarr.push(row.name) 
        designationFinalarr.push(row.designation) 
        salaryFinalarr.push(row.salary) 
        wagesrateFinalarr.push(row.wages_rate) 
        uanFinalarr.push(row.uan) 
        daysFinalarr.push(row.da) 
        daysFinalarr.push(row.days_present) 
        totalwagesFinalarr.push(row.total_wages) 
    }) 
    
  4. 如果你想,你爲什麼連查詢像這樣在創建數據庫中的元素的數組列表第一名?查詢你的數據庫,直接獲取數組中的元素列表。如果你真的不想這樣做,請使用類似Array.prototype.map()forEach來映射結果而不是推送到一堆新陣列。爲了好玩,我在一行中做了這個。也許可以用map()reduce()更乾淨來完成:

    var o = {} 
    rows.forEach(row => Object.keys(row).forEach(key => (o[key] === undefined) ? o[key] = [row[key]] : o[key].push(row[key]))) 
    
+0

是的,我想創建一個元素的數組列表。 爲名稱Finalarr我得到的值爲['faraz ahmed,'pintu','agraba',....],並且我還將其他數字也作爲此數組中的值。不知道爲什麼 – faraz

+0

我喜歡forEach的想法。感謝那 是的,你是正確的關於nameFinal沒有被設置。我首先想到了設置nameFinal然後推入數組,然後認爲最好不要將數值推入數組這在2個步驟。 – faraz

+0

我剛剛記錄了行,看起來我只從語句的第一部分獲取值,並且沒有在語句的UNION ALL部分之後獲取任何值。似乎這就是這裏出了什麼問題。那麼,爲什麼第二個select語句不工作? UNION ALL語句之後的部分? – faraz

0

良好,由先前的答覆中提供的線索,我設法解決這個問題。 似乎對多條語句工作,我需要把這樣的事情

var connection = mysql.createConnection({multipleStatements: true}); 

,然後我需要改變語句的語法了。

所以,我不得不SQL查詢從

SELECT name,designation,salary,wages_rate FROM employee_details UNION ALL SELECT uan,da,days_present,total_wages FROM attendance_details 

改變這個如下:

SELECT name,designation,salary,wages_rate FROM employee_details;SELECT uan,da,days_present,total_wages FROM attendance_details; 

所以,事實證明我沒有需要使用UNION ALL畢竟。

反正,問題解決了。 我用這個頁面尋求幫助 - https://github.com/mysqljs/mysql#multiple-statement-queries