2014-09-28 5 views
0

редактировать: структуру таблицы, http://puu.sh/bQKRz/785c731604.pngДаже если MySQL «где» условие не выполняется, то возвращает строку

/* 
* Let's get a RANDOM question from the questions table 
* Ignore questions the group has already 
*/ 
Group.prototype.getRandomQuestion = function(callback){ 
    var self = this; 
    var answered = this.answered.join(); 
    var categories = this.categories; 

    var sql = "SELECT * FROM `questions` WHERE (`id` NOT IN (?) AND `category` IN (?)) ORDER BY RAND() LIMIT 1"; 

    this.mysql_pool.getConnection(function(err, conn){ 
     if(!err){ 
      conn.query(sql, [answered, categories], function(err, r){ 
       conn.release(); 

выше мой код. По какой-то чертовой причине он по-прежнему извлекает по крайней мере один результат из базы данных, когда это НЕ ДОЛЖНО. Предложение where не должно выполняться.

Я открыл PhpMyAdmin, выполнил тот же точный запрос с теми же точными данными, которые были подключены к нему. Он вернулся пустой. Хорошо. Так почему же этот блок кода тоже не возвращается?

Вот значения answered и categories соответственно:

enter image description here

answered = "1,2"

categories = "1,2,3,4"

В мой стол questions, есть только два вопроса. Оба вопроса имеют ID 1 & 2. Итак, почему этот блок кода все еще возвращает строку?

+0

Всегда ли такой же ряд? Если да, то какая строка? – mscdex

+0

Кроме того, вы пытались заставить 'categories' быть' this.categories.join(); 'вместо' this.categories'? Возможно, mysql делает что-то неожиданное с значениями массива. – mscdex

+0

@mscdex Это всегда вторая строка – X33

ответ

2

Предположим, у нас есть таблица, содержащая две строки с идентификаторами 1 и 2 соответственно.

select * from table where id in ('1, 2') ==> вы получите только одну строку, которая имеет идентификатор

select * from table where id not in ('1, 2') ==> вы также получите только одну строку, которая имеет идентификатор

Дело в том, ('1, 2') - это не то же самое, что и ('1', '2').

0

Можете ли вы дать полный SQL с массивами, возвращающими ID 2? жаль, что поставил его как ответ ... не позволив мне оставить комментарий.

+0

@Jiang, поэтому мне было интересно узнать полный SQL, если его числовому массиву одиночные кавычки даже не нужны просто (1 , 2) - это все, что необходимо. – RobNHood

+0

http://puu.sh/bQKRz/785c731604.png – X33

+0

Вы правы. Я думаю, что это проблема. – Jiang

0
var ID = new Array(1,2); 
var Categories = new Array(1,2,3,4,5); 

var IDstring = "'" + ID.join("','") + "'"; 
var Categoriesstring = "'" + Categories.join("','") + "'"; 

    var sql = "SELECT * FROM `questions` WHERE `id` NOT IN (" + IDstring + ") AND `category` IN (" + Categoriesstring + ") ORDER BY RAND() LIMIT 1"; 
Смежные вопросы