2013-07-06 6 views
0

Эта проблема относится к узлу-mysql.Запрос нескольких строк с помощью node-mysql

У меня, кажется, проблема со следующим кодом, и, похоже, это связано с использованием пользовательских переменных. Полученный запрос выполняется нормально внутри любой IDE mysql, возвращая несколько записей. Однако при выполнении node-mysql он возвращает только одну запись.

Я проверил, что исключение предложения WHERE, задающего T3.gender_rank, создает прогнозируемые результаты как в узле-mysql, так и в моей mysql IDE.

Была ли эта проблема поднята раньше, или это что-то, что я делаю неправильно?

var mysql = require('mysql'); // Establish SQL Support 
var sql = 
    "select team, `div`, sum(points) AS teampoints "+ 
    "from ("+ 
    " select "+ 
    "  *, "+ 
    "  (@genderRank := CASE WHEN @genderTMP <> gender THEN 1 ELSE @genderRank+1 END) AS gender_rank, "+ 
    "  (@genderTMP := gender) AS _gt "+ 
    " from ("+ 
    "  select * "+ 
    "  from racepoints "+ 
    "  WHERE "+ 
    "   ltrim(rtrim(race)) = '"+data.eventName+"' AND "+ 
    "   racedate = '"+getSimpleDate(new Date(data.eventStart))+"' "+ 
    "  ORDER BY team,gender,points DESC "+ 
    " ) T1, "+ 
    " (select @genderRank:=0 AS gender_rank_start) T2 "+ 
    ") T3 "+ 
    "WHERE "+ 
    " (T3.gender_rank <= 4 AND rtrim(ltrim(`div`)) = 'D2') OR "+ 
    " (T3.gender_rank <= 3 AND rtrim(ltrim(`div`)) = 'D1') "+ 
    "GROUP BY team, `div` "+ 
    "ORDER BY `div`, teampoints DESC, team"; 


var db = new mysql.createConnection({ 
    host : 'localhost', 
    user : 'root', 
    password : 'admin', 
    database : 'nps', 
    multipleResults : true 
}); 
db.connect(); 
db.query(
    sql, 
    function(err,rows,fields){ 
     if(err){ 
      console.log(err); 
      return; 
     } 
     console.log(rows); 
    } 
); 
db.end(); 

Файл базы данных SQL также доступен здесь: https://snipt.net/download/dde8b4b5ce8cd5fca21ac2334bae634f/-5369.sql

+0

что в '' data' и getSimpleDate'? –

ответ

1

Вместо непосредственного добавления переменных в SQL-строку, пусть пакет MySQL сделает это за вас. Обычно это решает такие проблемы, как эта, и дополнительно защищает от SQL-инъекций.

Это делается с использованием вопросительных знаков (по одному для каждой переменной), за которыми следует массив переменных.

Например

connection.query('SELECT * FROM users WHERE id = ?', [userId], function(err, results) { 
    // ... 
}); 
+0

ehsangh, Это будет работать для двух значений, которые я конкатенирую, но не для пользовательских переменных. Как вы можете видеть, они действительно динамичны в инструкции SQL, а не то, что я могу передать в качестве переменной в запросе. – clayperez

Смежные вопросы