Здравствуйте. Подскажите пожалуйста можно ли данные в столбце вида 25-35, 45, 55-60, 70 привести к виду 25, 45, 55 ,70. Привести их к типу int и сравнить с полученным значением скажем >=25.
Отличный ответ. Если можно то как? Я же не просто так спрашиваю. Пример приведите пожалуйста данного запроса.
Какой вопрос - такой ответ PHP: $str = "25-35, 45, 55-60, 70"; $arr = explode(",",$str); $out = array_map("intval",$arr); print_r($out);
Так я и сам умею. Я вообще то задал этот вопрос в разделе MySQL в расчете на SQL запрос. SQL умеет соединять данные из столбцов это я уже знаю. Знаю как привести к соответствующему типу с помощью CAST но если использовать его в чистом виде то вот такая запись 25-35 превратиться в -10
https://phpclub.ru/mysql/doc/string-functions.html Код (Text): SELECT * FROM t WHERE CAST(LEFT(field,LOCATE('-', field)) AS UNISIGNED)<25;
Спасибо а можно поподробнее расписать команду а то я получаю синтаксическую ошибку. Код ошибки - 1064 Вот мой запрос: SELECT * FROM `t` WHERE CAST(LEFT(`zp_c`,LOCATE('-', `zp_c`)) AS UNISIGNED)<25; И еще я нашел вот какую функцию STRING_SPLIT и вот какой попробовал запрос: SELECT value FROM STRING_SPLIT('25-35', '-'); но тоже получил синтаксическую ошибку. Код ошибки - 1064 --- Добавлено --- Версия mysql 5.6.38-83.0 а то вдруг не поддерживает данные функции.
попробовал такой запрос SELECT * LOCATE('-', `zp_c`) as pos FROM `t` чтоб узнать работает ли функция LOCATE - работает
ADSoft я почитал про функцию LEFT она возвращать должна при таком подходе 3 символа. А надо 2 символа то есть из LOCATE('-', `zp_c`) надо отнять еще единицу. Ну а по синтаксису пока не разобрался что ему не нравиться.
Код (Text): SELECT * FROM е where CAST(LEFT(field,LOCATE(',', field)-1) AS UNSIGNED) <25 Все работает, никаких ошибок --- Добавлено --- хотя копировал с мануала - чето неверно слово было )
ADSoft не знаю почему но запрос вот такого вида: Код (Text): SELECT * FROM t where CAST(zp_c AS UNSIGNED) >=25 тоже дает правильную выборку. Находит значения больше 25 Он выдал при выборке такие записи в ответе: '25-35', 60, 40, 33 Наверное из-за этого параметра: UNSIGNED Просто я находил пример такого подхода и там писали что при такой записи ты должен получить результат в значение -10 А твой запрос я протестировал и он выдал только ответ: '25-35'.
Я не знаю какие данные в вашей таблицы.. если те что указаны - он вообще ничего не должен выдавать - так как знак < 25 если сделаете >=25 будет как у вас
ADSoft как не знаешь я в первой записи указал вид хранившихся данных в таблице: 25-35, 45, 55-60, 70 И написал что надо сделать выборку по полученному числу скажем 25. В общем вот какой я решил сделать запрос в итоге: SELECT * FROM `tab` where CAST(zp_c AS UNSIGNED) >=25 OR CAST(LEFT(`zp_c`,LOCATE('-', `zp_c`)+1) AS UNSIGNED) >=25 первая часть отвечать будет за цифры полученные вначале ячейки то есть из приведенных данных это такие строки я получаю для сравнения 25, 45, 55, 70 а вторая часть запроса за вторую часть ячейки и я в таком случае получаю сроки для сравнения 35, 0, 60, 0. Спасибо большое за ссылку и твой пример очень сильно помог.
на будущее - желательно не хранить такие данные в базе, заносить обычные числа - чтоб не обрабатывать их потом
ADSoft в базе хранятся для данного поля не только цифры, знал бы ты все нюансы понял бы что это оптимальный вариант для этих значений. Это дополнительно введенное мною поле в данные которые будут заливать на сайт. И я на пальцах объяснял что если клиент хочет получить то что он мне объясняет то это поле необходимо и хотя бы в таком виде.