[Решено] TV в условии
Всем привет! Есть задачка — получить ресурсы у которых TV поле меньше 400 и больше 420.
На первый взгляд задачка тривиальная кажется все просто, но на практике получаем, что в базе поле хранится как строка (mediumtext), хоть в админке и установлен тип число.
Вот такой код:
Как правильно составить запрос?
P.S. Пока просто выбираю нужные ресурсы и дальше фильтрую силами php. Но хочется реализовать все на стороне базу данных.
На первый взгляд задачка тривиальная кажется все просто, но на практике получаем, что в базе поле хранится как строка (mediumtext), хоть в админке и установлен тип число.
Вот такой код:
$parents = '2240';
$pdoFetch = $modx->getService('pdoFetch');
$where = array(
'published' => '1',
'deleted' => '0',
'Square.value:>=' => '400',
'Square.value:<=' => '420'
);
$leftJoin = array(
'Square' => array(
'class' => 'modTemplateVarResource',
'on' => 'Square.contentid = modResource.id AND Square.tmplvarid = 49'
)
);
$select = array(
'modResource' => 'id,pagetitle,parent',
'Square' => 'CAST(Square.value AS SIGNED) AS square'
);
$options = array(
'class' => 'modResource',
'parents' => $parents,
'leftJoin' => $modx->toJSON($leftJoin),
'where' => $modx->toJSON($where),
'return' => 'data',
'select' => $modx->toJSON($select),
'limit' => 0
);
$pdoFetch->setConfig($options, false);
$products = $pdoFetch->run();
Выдает вот такой результат:array(2) {
[0]=>
array(4) {
["id"]=>
string(4) "8467"
["pagetitle"]=>
string(82) "Участок + здание 415,88м2 Район Лефортово ГП16804754"
["parent"]=>
string(4) "2240"
["square"]=>
string(3) "415"
}
[1]=>
array(4) {
["id"]=>
string(4) "8619"
["pagetitle"]=>
string(78) "Здание 4 161,88м2 Район Преображенское ГП16842909"
["parent"]=>
string(4) "2240"
["square"]=>
string(4) "4161"
}
}
Если в условии Square.value меняю на square или Square.square то в ответ получаю пустоту.Как правильно составить запрос?
P.S. Пока просто выбираю нужные ресурсы и дальше фильтрую силами php. Но хочется реализовать все на стороне базу данных.
Поблагодарить автора
Отправить деньги
Комментарии: 3
Всем спасибо за внимание! Разобрался! Необходимо использовать BETWEEN а не больше и меньше.
А почему CAST(Square.value AS SIGNED) AS square? Если сделать DECIMAL — разве не будет работать больше и меньше?
CAST(Square.value AS DECIMAL(13,3)) AS square
Ну SIGNED это по-сути диапазон целых чисел. У меня в базе пока целые числа. Так что не думаю что DECIMAL изменит ситуацию.
Но, Илья, в любом случае спасибо! Буду тестировать!)
P.S. Пока еще не проверял BETWEEN с числами с плавающей точкой!)))
Но, Илья, в любом случае спасибо! Буду тестировать!)
P.S. Пока еще не проверял BETWEEN с числами с плавающей точкой!)))
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.