SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 06.07.2016 13:29:51

Osi322
Участник
Зарегистрирован: 04.07.2014
Сообщений: 24

information_schema и связь с таблицами

Столкнулся со следующей задачей, пишу код который создает программно таблицы на php.
Что есть:
1)создаются таблицы tbcheck_1,tbcheck_2,...
2) к колонкам пишутся  комментарии - типа названия колонки col0(ФИО),col1(дата),col2(масса) и тому подобное
Запросом выводится следущее

SELECT COLUMN_NAME, COLUMN_COMMENT, DATA_TYPE
FROM information_schema.`COLUMNS`
WHERE TABLE_NAME =  'tbcheck_1' AND COLUMN_COMMENT <>  ''

Результат:
COLUMN_NAME | COLUMN_COMMENT  | DATA_TYPE
col0                |   целое                  |   int
col1                |   дробное               |  double
col2                |   строка                 |   varchar

А теперь можно ли построить запрос такого типа:
SELECT COLUMN_NAME, COLUMN_COMMENT, DATA_TYPE  -- что-то волшебное здесь а может и не здесь--
FROM information_schema.`COLUMNS`
--left join db_test.tbcheck_1  on idtbcheck=3    // вывести значения колонки 3-его id--
WHERE TABLE_NAME =  'tbcheck_1' AND COLUMN_COMMENT <>  ''

COLUMN_NAME | COLUMN_COMMENT  | DATA_TYPE  | val
col0                |   целое                  |   int            |  1   (значение col0 третьего ID в из таблицы tbcheck_1)
col1                |   дробное               |  double        |  1.0  (значение col1 третьего ID в из таблицы tbcheck_1)
col2                |   строка                 |   varchar      | abc (значение col2 третьего ID в из таблицы tbcheck_1)

Такое вообще возможно запросом состряпать? или только два запроса два массива и по ключам выводить, чтобы получить массив(dan_col):

$sql_select="SELECT COLUMN_NAME,COLUMN_COMMENT,DATA_TYPE FROM information_schema.`COLUMNS` WHERE TABLE_NAME = '".$namtb."' AND COLUMN_COMMENT<>''";
        $result= $connect->query($sql_select);
        while ($row = $result->fetch_object())
            {
                $this->information_schema[]=array('COLUMN_NAME'=>$row->COLUMN_NAME,'COLUMN_COMMENT'=>$row->COLUMN_COMMENT,'DATA_TYPE'=>$row->DATA_TYPE);
            }
            $col="";
        foreach ($this->information_schema as $value) {
           
                $col.=$value['COLUMN_NAME'].",";
           
        }
        $col=substr($col, 0, -1);
            $sql_select="SELECT $col FROM `tbcheck_1` WHERE idtbcheck= '".$id_otchet."'";
        $result= $connect->query($sql_select);
       
        while ($row = $result->fetch_assoc())
            {
                foreach ($this->information_schema as $value) {
                    $this->dan_col[]=array('val_name_col'=>$row[$value['COLUMN_NAME']],'coment_col'=>$value['COLUMN_COMMENT'],'date_type_col'=>$value['DATA_TYPE'],'column_name_col'=>$value['COLUMN_NAME']);
                }
            }
 

Отредактированно Osi322 (06.07.2016 15:26:31)

Неактивен

 

#2 06.07.2016 20:19:56

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: information_schema и связь с таблицами

Как подставить имя колонки из переменной не знаю. Скорее всего такой возможности нет

Неактивен

 

#3 07.07.2016 06:58:06

Osi322
Участник
Зарегистрирован: 04.07.2014
Сообщений: 24

Re: information_schema и связь с таблицами

Ясно, тоже как ни думал все операторы и функции работают только с данными в столбцах. ни как не сравнить не и не вывести название столбцов таблиц.. значит это единственный вариант. Спасибо!

Неактивен

 

#4 07.07.2016 13:41:20

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: information_schema и связь с таблицами

create table test (id int comment 'число', q varchar(100) comment 'строка');

insert into test values(1,'one'),(5,'five');

SELECT COLUMN_NAME, COLUMN_COMMENT, DATA_TYPE,
if(column_name = 'id', id, q)  -- что-то волшебное здесь а может и не здесь--
FROM information_schema.`COLUMNS`
left join test.test  on id=5
WHERE TABLE_NAME = 'test' AND COLUMN_COMMENT <>  '';

+-------------+----------------+-----------+-------------------------------+
| COLUMN_NAME | COLUMN_COMMENT | DATA_TYPE | if(column_name = 'id', id, q) |
+-------------+----------------+-----------+-------------------------------+
| id          | число          | int       | 5                             |
| q           | строка         | varchar   | five                          |
+-------------+----------------+-----------+-------------------------------+
2 rows in set (0.00 sec)


при большем числе колонок if будет вложенный. для вашего случая:
if(column_name = 'col0', col0, if(column_name = 'col1', col1, col2))

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson