За последние 24 часа нас посетили 20329 программистов и 1090 роботов. Сейчас ищет 721 программист ...

Можно ли данные в столбце разделить на две переменные или хотябы взять только одно значение

Тема в разделе "MySQL", создана пользователем victort, 17 мар 2018.

Метки:
  1. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    Здравствуйте. Подскажите пожалуйста можно ли данные в столбце вида 25-35, 45, 55-60, 70 привести к виду 25, 45, 55 ,70.
    Привести их к типу int и сравнить с полученным значением скажем >=25.
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.817
    Симпатии:
    735
    Адрес:
    Татарстан
    Можно
     
  3. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    Отличный ответ. Если можно то как? Я же не просто так спрашиваю. Пример приведите пожалуйста данного запроса.
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.817
    Симпатии:
    735
    Адрес:
    Татарстан
    Какой вопрос - такой ответ
    PHP:
    1. $str = "25-35, 45, 55-60, 70";
    2. $arr = explode(",",$str);
    3. $out = array_map("intval",$arr);
    4. print_r($out);
     
  5. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    Так я и сам умею. Я вообще то задал этот вопрос в разделе MySQL в расчете на SQL запрос. SQL умеет соединять данные из столбцов это я уже знаю. Знаю как привести к соответствующему типу с помощью CAST но если использовать его в чистом виде то вот такая запись 25-35 превратиться в -10
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.817
    Симпатии:
    735
    Адрес:
    Татарстан
  7. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    Спасибо а можно поподробнее расписать команду а то я получаю синтаксическую ошибку. Код ошибки - 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 а то вдруг не поддерживает данные функции.
     
  8. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    попробовал такой запрос SELECT * LOCATE('-', `zp_c`) as pos FROM `t` чтоб узнать работает ли функция LOCATE - работает
     
  9. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    ADSoft я почитал про функцию LEFT она возвращать должна при таком подходе 3 символа. А надо 2 символа то есть из LOCATE('-', `zp_c`) надо отнять еще единицу. Ну а по синтаксису пока не разобрался что ему не нравиться.
     
  10. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.817
    Симпатии:
    735
    Адрес:
    Татарстан
    Код (Text):
    1. SELECT * FROM е
    2. where CAST(LEFT(field,LOCATE(',', field)-1) AS UNSIGNED) <25
    Все работает, никаких ошибок
    --- Добавлено ---
    хотя копировал с мануала - чето неверно слово было )
     
    victort нравится это.
  11. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    ADSoft не знаю почему но запрос вот такого вида:
    Код (Text):
    1. SELECT * FROM t where CAST(zp_c AS UNSIGNED) >=25
    тоже дает правильную выборку. Находит значения больше 25
    Он выдал при выборке такие записи в ответе: '25-35', 60, 40, 33
    Наверное из-за этого параметра: UNSIGNED
    Просто я находил пример такого подхода и там писали что при такой записи ты должен получить результат в значение -10

    А твой запрос я протестировал и он выдал только ответ: '25-35'.
     
    #11 victort, 20 мар 2018
    Последнее редактирование: 20 мар 2018
  12. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.817
    Симпатии:
    735
    Адрес:
    Татарстан
    Я не знаю какие данные в вашей таблицы.. если те что указаны - он вообще ничего не должен выдавать - так как знак < 25
    если сделаете >=25 будет как у вас
     
  13. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    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.
    Спасибо большое за ссылку и твой пример очень сильно помог.
     
  14. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.817
    Симпатии:
    735
    Адрес:
    Татарстан
    на будущее - желательно не хранить такие данные в базе, заносить обычные числа - чтоб не обрабатывать их потом
     
  15. victort

    victort Активный пользователь

    С нами с:
    8 сен 2010
    Сообщения:
    86
    Симпатии:
    2
    ADSoft в базе хранятся для данного поля не только цифры, знал бы ты все нюансы понял бы что это оптимальный вариант для этих значений. Это дополнительно введенное мною поле в данные которые будут заливать на сайт. И я на пальцах объяснял что если клиент хочет получить то что он мне объясняет то это поле необходимо и хотя бы в таком виде.