Проблемы с выборкой дробных интервалов из поля с типом text (MySQL)

danneo

Честный
Регистрация
13 Ноя 2007
Сообщения
1.526
Реакции
121
В БД сохраняются значения доп.полей. Таблица такая:
id - ключ
id_object (int) - id объекта для которого сохранено значение поля
id_fields (int) - id доп.поля, у которого выбрано значение
val (text) - написание значения на латинском, для ЧПУ. Например, подставляется в списках в value и т.п.
text_val (text) - русское написание значения

Возникла проблема. Решил сделать фильтры с интервалами, от и до. А в столбце val сохраняются цифры integer и float. Дак вот с флоат проблемы. Не ищется ничего по условию больше или меньше, т.к. условия поиска с точкой (дробное значение). В таблице значения, например, 0.5 или 1.9.
Условие фильтров с целыми значениями (Integer) ищется нормально.
Как решать, даже не представляю.
Подскажите, пожалуйста, кто силен в этом.
 
Попробуйте cast(val as float). Но учтите, что все текстовые значения будут трактоваться как float.
 
Попробуйте cast(val as float). Но учтите, что все текстовые значения будут трактоваться как float.
У меня длинный запрос и много строк с условиями. Вырезка (может с ошибкой, т.к. собрал на коленке:(
Код:
... IN (
SELECT  db_fieldsdata.id_object
FROM db_fieldsdata
  INNER JOIN db_fields
   ON db_fieldsdata.id_field = db_fields.id
WHERE
  ( db_fields.un_name = 'power' AND db_fieldsdata.val >= 0.5 AND db_fieldsdata.val <= 101.5 )
AND ( db_fields.un_name = 'color' AND db_fieldsdata.val REGEXP '[[:<:]]("red|black")[[:>:]]' )
GROUP BY db_fieldsdata.id_object
)
куда здесь нужно запихнуть cast?
 
AND cast(db_fieldsdata.val as float) >= 0.5 AND cast(db_fieldsdata.val as float) <= 101.5
 
AND cast(db_fieldsdata.val as float) >= 0.5 AND cast(db_fieldsdata.val as float) <= 101.5
как-то не получается, ошибку выдает:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''float') >= 1.5 AND cast(dle_reviews_fieldsdata.val as 'float') <= 4 ) ' at line 11
Запрос такой:
Код:
SELECT COUNT(*) as count
FROM db_objects
WHERE  db_objects.active = '1'
AND `sectionid` = 37
AND db_objects.count > 0
AND    db_objects.id IN (
        SELECT db_fieldsdata.id_object
        FROM db_fieldsdata
            INNER JOIN db_fields
                ON db_fieldsdata.id_field = db_fields.id
        WHERE
        ( db_fields.un_name = 'proizvoditelnost_myasorubki'  AND cast(db_fieldsdata.val as float) >= 1.5 AND cast(db_fieldsdata.val as float) <= 4   ) 
                        AND   ( db_fields.un_name = 'moshhnost_myasorubki'  AND db_fieldsdata.val >= 120  AND db_fieldsdata.val <= 600)
        GROUP BY db_fieldsdata.id_object
    )
 
Забыл, что в mysql чуть чуть подругому.
Нужно приводить к типу DECIMAL
cast(LOGIN as DECIMAL(10,6))
Первая цифра - знаки до запятой, вторая - после.
 
Забыл, что в mysql чуть чуть подругому.
Нужно приводить к типу DECIMAL
cast(LOGIN as DECIMAL(10,6))
Первая цифра - знаки до запятой, вторая - после.
Какая-то ерунда все равно.
Например, у меня два фильтра: мощность и вес в кг. Если выбираю значения в одном из двух фильтров, то все срабатывает нормально. А если выбираю значения в двух фильтрах, то результат выборки равен нулю, независимо от введенных значений (интервалов).
Пример запроса:
Код:
SELECT db_fieldsdata.id_object
FROM db_fieldsdata
INNER JOIN db_fields
ON db_fieldsdata.id_field = db_fields.id
WHERE
( db_fields.un_name = 'proizvoditelnost_myasorubki' AND cast( db_fieldsdata.val as DECIMAL(4,2) ) >= 1.2 AND cast( db_fieldsdata.val as DECIMAL(4,2) ) <= 2 )
AND
( db_fields.un_name = 'moshhnost_myasorubki'  AND cast( db_fieldsdata.val as DECIMAL(4,0) ) >= 150 )

GROUP BY db_fieldsdata.id_object
Либо второе условие AND заменить без типа данных, все равно выборка равна нулю
Код:
AND
( db_fields.un_name = 'moshhnost_myasorubki'  AND  db_fieldsdata.val  >= 150 )

p.s. пересечения объектов по указанным параметрам есть, т.е. по условиям только одного или другого поля выводятся объекты, которые и там и там есть. Но по обоим условиям сразу не выводятся.
 
Последнее редактирование:
db_fields.un_name = 'moshhnost_myasorubki' AND cast( db_fieldsdata.val as DECIMAL(4,0) ) >= 150 - находит что нибудь?
 
db_fields.un_name = 'moshhnost_myasorubki' AND cast( db_fieldsdata.val as DECIMAL(4,0) ) >= 150 - находит что нибудь?
дак я и говорю, что да. По отдельности находит. id объектов есть и в том и в другом случае. Т.е. объект, например с id 62, находится при запросе:
( db_fields.un_name = 'proizvoditelnost_myasorubki' AND cast( db_fieldsdata.val as DECIMAL(4,2) ) >= 1.2 AND cast( db_fieldsdata.val as DECIMAL(4,2) ) <= 2 )
или при запросе:
( db_fields.un_name = 'moshhnost_myasorubki' AND cast( db_fieldsdata.val as DECIMAL(4,0) ) >= 150 )
А если сделать сразу два условия, объектов 0

Просто из запроса убираю вручную одно или другое условие, все выводится. А с обоими параметрами нет ничего
 
Последнее редактирование:
db_fields.un_name = 'moshhnost_myasorubki' AND cast( db_fieldsdata.val as DECIMAL(4,0) ) >= 150 - находит что нибудь?
Оказалась проблема в другом. Если в условии WHERE поставить оператор "OR", то запрос срабатывает. Но получается, что, например, нужно сделать выборку производительность от 1,5 до 2 кг, и мощность более 150Вт, то должен же быть оператор "AND".
Может быть проблема в с порядком выражений между операторами AND и OR? Подскажите, пожалуйста. Пол дня мозги себе кручу-верчу.
Код:
SELECT db_fieldsdata.id_object
FROM db_fieldsdata
INNER JOIN db_fields
ON db_fieldsdata.id_field = db_fields.id
WHERE
( db_fields.un_name = 'proizvoditelnost_myasorubki' AND cast( db_fieldsdata.val as DECIMAL(4,2) ) >= 1.2 AND cast( db_fieldsdata.val as DECIMAL(4,2) ) <= 2 )
OR
( db_fields.un_name = 'moshhnost_myasorubki'  AND cast( db_fieldsdata.val as DECIMAL(4,0) ) >= 150 )
OR
( db_fields.un_name = 'revers_u_myasorubki' AND db_fieldsdata.val REGEXP '[[:<:]](yes|no)[[:>:]]' )

GROUP BY db_fieldsdata.id_object
 
Назад
Сверху