За последние 24 часа нас посетили 20094 программиста и 1695 роботов. Сейчас ищут 1844 программиста ...

вывод результата в зависимости от типа столбца

Тема в разделе "MySQL", создана пользователем hyperint, 11 янв 2008.

  1. hyperint

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

    С нами с:
    19 окт 2007
    Сообщения:
    32
    Симпатии:
    0
    Здравствуйте. Возникла проблема, надеюсь кто-нибудь сможет помочь. Уже устал мозги ломать.
    Допустим, есть таблица `My_Table` с полями `id`, `data1`, `data2` и т.д.
    Мне при выводе запроса нужно, чтобы производилась проверка типа поля и в зависимости от типа - преобразование данных. Например, если тип поля - tinyint(1) unsigned - то значение 0 в ячейках этого столбца интерпретировать как 'нет', 1 - как 'да'. Если тип какой-то другой - выводить без изменений.
    Конечно, такую проверку можно сделать уже после передачи результатов запроса в PHP. Но для меня желательно, чтобы преобразование делал именно MySQL. Возможно ли это?
    Команда SHOW выдает целую таблицу, а сделать вложенный запрос SELECT -> SHOW у меня не получилось. Что посоветуете?
     
  2. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    hyperint
    Что-то наподобие:

    PHP:
    1. <?php
    2.  
    3. function getTableFieldType($table, $field)
    4. {
    5.   static $cache=array();
    6.   if(!isset($cache[$table])) {
    7.     $cache[$table]=array();
    8.     $result=mysql_query("SHOW COLUMNS FROM $table");
    9.     while($row=mysql_fetch_assoc($result)) {
    10.       $source=strtoupper($row["Type"]);
    11.       if($source=="TINYINT(1)") $type="boolean";
    12.       else if(preg_match("{INT\b}",$source)) $type="integer";
    13.       else if(preg_match("{\b(FLOAT|DOUBLE|DECIMAL)\b}",$source)) $type="float";
    14.       else $type="text";
    15.       $cache[$table][$row["Field"]]=$type;
    16.     }
    17.     mysql_free_result($result);
    18.   }
    19.   return isset($cache[$table][$field])?$cache[$table][$field]:false;
    20. }
    Иначе боюсь никак...
     
  3. hyperint

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

    С нами с:
    19 окт 2007
    Сообщения:
    32
    Симпатии:
    0
    Большое спасибо за приведенный пример. Значит, одним запросом вывод и преобразование никак не сделаешь... Ну что ж, бум думать.
     
  4. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    [sql]CREATE TABLE type_convert (
    type_id TINYINT,
    value CHAR(3)
    );
    INSERT INTO type_convert VALUES(0, 'нет');
    INSERT INTO type_convert VALUES(1, 'да');[/sql]

    и объедените с этой таблицей
     
  5. hyperint

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

    С нами с:
    19 окт 2007
    Сообщения:
    32
    Симпатии:
    0
    Ti
    Не совсем понял... А что это даст.
    1) Создаем таблицу со столбцами `type_id`, `value`
    2) добавляем две записи (0, 'нет') и (1, 'да')
    3) Объединяем (кстати, как? :)
    Т.е. в исходной таблице добавляется еще два поля и две записи... эээ... а дальше что? Можно поподробнее?
     
  6. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Если я правильно понял, то вам нужны функции mysql_field_type и mysql_field_flags
     
  7. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    а можно нескромный вопрос? зачем?
     
  8. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    нет, таблица другая

    [sql]SELECT value
    FROM table
    LEFT JOIN type_convert ON table.row = type_convert.type_id
    WHERE ...[/sql]
     
  9. hyperint

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

    С нами с:
    19 окт 2007
    Сообщения:
    32
    Симпатии:
    0
    AlexGousev
    Не совсем. Функции полезные (про них я не знал), но нужно не совсем то. Чтобы замена производилась до того, как результаты запроса передаются PHP. Т.е. в таблице идут значения:
    183, 11, 'Пупупкин', 0, 1, 1, 0
    а MySQL выдал:
    183, 11, 'Пупупкин', 'нет', 1, 'да', 0

    dark-demon
    На выводе вместо 0/1 мне нужно иметь "нет"/"да". Такая ситуация, что в разных таблицах эти самые поля `data1`, ... могут иметь разные типы. А производить анализ типа поля уже в PHP мне неудобно, потому как придется многое переделывать :(
     
  10. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
  11. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    [sql]SELECT
    (SELECT value FROM type_convert WHERE type_id = row1 LIMIT 1) AS row1,
    (SELECT value FROM type_convert WHERE type_id = row2 LIMIT 1) AS row2,
    (SELECT value FROM type_convert WHERE type_id = row3 LIMIT 1) AS row3
    FROM table
    WHERE ...[/sql]
     
  12. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    [sql]SELECT if (f1 in (1,0), if (f1=1, 'да','нет'), f1) as ff1 from table[/sql]
     
  13. hyperint

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

    С нами с:
    19 окт 2007
    Сообщения:
    32
    Симпатии:
    0
    armadillo
    Имелось в виду не совсем это. Насколько я понимаю, в приведенном примере на да и нет будут заменены все 0 и 1 независимо от типа столбца.
    Зато варианты с enum и объединением таблиц прошли на ура. Всем спасибо за помощь.