Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте!У меня возникла проблема:Мне необходимо вывести те столбцы,имена которых соответсвует шаблону.Но у меня возникает ошибка.Обьясните в чем проблема.Вот код:
<?php
//Задаем минимальный уровень
$level=1;
//Загружаем содержимое файла config.php
include "config.php";
// Формируем SQL-запрос
$query = "SELECT %-$level FROM struc";
// Выполняем SQL-запрос
$tst = mysql_query($query);
// Проверяем успешность выполнения SQL-запроса
if(!$tst) exit(mysql_error());
// Выводим результат
$num=mysql_num_rows($tst);
echo $num;
?>
Неактивен
необходимо вывести те столбцы,имена которых соответсвует шаблону
К сожалению, синтаксис SQL не позволяет указывать список столбцов в виде шаблона. Их необходимо все прописывать явно.
Если Вы используете MySQL пятой версии, то можно написать процедуру, которая принимает шаблон, формирует из него список столбцов для нужной таблицы (на основе INFORMATION_SCHEMA) и возвращает соотв. данные.
Неактивен
А как можно применить INFORMATION_SCHEMA к моей проблеме?Я просто еще только начинающий и мало что знаю о БД)
Неактивен
Для начала давайте убедимся, что у Вас нужная версия сервера.
Что дает запрос SELECT VERSION() ?
Неактивен
Вообще я работаю с Denwer,и если верить разработчикам,то у этого сервера такие параметры:Apache 2 + SSL, PHP 5, MySQL 5.
Неактивен
Узнаете точно, если выполните SELECT VERSION();
(это можно сделать, например, в консоли mysql)
Что-то я сомневаюсь, чтобы в Денвере был пятый MySQL...
Неактивен
MySQL 5.0.45-community-nt
Неактивен
Ура, денвер обновили )
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='dbname' AND
TABLE_NAME LIKE '%criterion';
Это выведет список таблиц в базе dbname с названием, удовлетворяющим
шаблону %criterion.
Неактивен
Дело в том,что мне надо выводить не имена таблиц,а именно имена столбцов....
Неактивен
Никита написал:
А как можно применить INFORMATION_SCHEMA к моей проблеме?Я просто еще только начинающий и мало что знаю о БД)
INFORMATION_SCHEMA Это виртуальная база (не хранится в виде файлов, а формируется во время запуска сервера) содержащая метаданные баз данных, т.е. информацию о структуре баз данных.
В ней есть таблица COLUMNS, содержащая информацию о всех колонках в таблицах. Из неё можно получить имена интересующих Вас столбцов с помощью поиска по шаблону
SELECT column_name FROM `INFORMATION_SCHEMA.COLUMNS` WHERE table_name='db_name.tb_name' AND column_name LIKE '%pattern';
Неактивен
Бальшое пасиба
Неактивен
Никита написал:
Дело в том,что мне надо выводить не имена таблиц,а именно имена столбцов....
Подробнее Вам стоит посмотреть документацию
по хранимому коду http://dev.mysql.com/doc/refman/5.0/en/ … dures.html
и INFORMATION_SCHEMA http://dev.mysql.com/doc/refman/5.0/en/ … chema.html
Выполните
SHOW TABLES FROM INFORMATION_SCHEMA
Из названий и структур таблиц, в общем-то, понятно о чем идет речь и какая Вам нужна.
Например, результат последней команды можно получить с помощью INFORMATION_SCHEMA
SELECT TABLE_NAME FROM TABLES WHERE TABLE_SCHEMA='INFORMATION_SCHEMA';
Отредактированно vasya (21.01.2008 13:46:05)
Неактивен
Никита написал:
Бальшое пасиба
Рано радуетесь. При написании процедуры в Вашем случае будет след. нюанс. После выборки из INFORMATION_SCHEMA интересующих Вас столбцов для формирования окончательного запроса нужно будет использовать подготовленные выражения (см. http://dev.mysql.com/doc/refman/5.0/en/sqlps.html), но там все достаточно просто.
Неактивен
Вообще на самом деле для такой задачи процедуру написать довольно сложно, особенно начинающему... Я попробую на досуге что-нть набросать.
Неактивен
Знаете,я сейчас пробовал разобраться с подготовленными выражениями,но так ничего и не понял.....Если можно то обьясните мне подробнее....И еще я пытался разлбраться с кодом,который вы мне дали:
"SELECT column_name FROM `INFORMATION_SCHEMA.COLUMNS` WHERE structura='structura.struc' AND column_name LIKE '%$level'"
,но чего то у меня ничего не получилось.....Если я правильно понял,то синтаксис написания примерно такой:
"SELECT имя столбца FROM `INFORMATION_SCHEMA.COLUMNS` WHERE имя бд='имя бд.имя таблицы' AND имя столбца LIKE '%$level'"
Но в таком случае получается,что столбец все равно приходится указывать....Что в моем случае недопустимо.....
Неактивен
Подготовленные выражения - это возможность выполнить (точнее, попытаться выполнить) абсолютно любую строку:
PREPARE имя_выражения_какое_хотите FROM какой_нибудь_запрос;
EXECUTE имя_выражения_какое_хотите;
Запрос можно вписать сразу, например:
PREPARE имя_выражения_какое_хотите FROM SELECT * FROM table_name;
Или сначала сделать переменную и потом приготовить из нее:
SET @query = 'SELECT * FROM table_name';
PREPARE имя_выражения FROM @query;
я пытался разлбраться с кодом,который вы мне дали:
"SELECT column_name FROM `INFORMATION_SCHEMA.COLUMNS` WHERE structura='structura.struc' AND column_name LIKE '%$level'"
,но чего то у меня ничего не получилось....
Что конкретно не получилось?
в таком случае получается,что столбец все равно приходится указывать....Что в моем случае недопустимо.....
Запрос, приведенный выше, выбирает имена всех столбцов, содержащие некий фрагмент, причем выборка делается из всех столбцов всех таблиц.
Соответственно, если не укажете таблицу, то запрос Вам вернет столбцы с нужными именами, но из непонятно каких таблиц, поэтому имя таблицы указать будет очень полезно (как, кстати, и имя БД; правда, это менее критично).
А почему недопустимо указывать имя таблицы? В чем трудность?
Неактивен
В моем случае имя таблицы указывать допустимо,а вот столбец должен выбираться автоматическиЕсли я вас правильно понял,то в моем случае получается вот такой програмный код:
//Задаем минимальный уровень
$level=1;
//Загружаем содержимое файла config.php
include "config.php";
// Формируем SQL-запрос
SET @query = 'SELECT * FROM struct;
$query = "PREPARE %-$level FROM @query";
// Выполняем SQL-запрос
$tst = mysql_query($query);
Неактивен
Никита написал:
И еще я пытался разлбраться с кодом,который вы мне дали:
"SELECT column_name FROM `INFORMATION_SCHEMA.COLUMNS` WHERE structura='structura.struc' AND column_name LIKE '%$level'"
,но чего то у меня ничего не получилось.....Если я правильно понял,то синтаксис написания примерно такой:
"SELECT имя столбца FROM `INFORMATION_SCHEMA.COLUMNS` WHERE имя бд='имя бд.имя таблицы' AND имя столбца LIKE '%$level'"
Но в таком случае получается,что столбец все равно приходится указывать....Что в моем случае недопустимо.....
Ошибка в том, что правильно будет `INFORMATION_SCHEMA`.`COLUMNS`
Можно вообще без бэктиков указать.
Синтаксис такой:
SELECT column_name FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE table_schema='имя бд' AND table_name='имя таблицы' AND column_name LIKE '%шаблон%';
Указываете Вы не столбец, а шаблон, что Вам и требовалось.
Неактивен
Lazy написал:
Вообще на самом деле для такой задачи процедуру написать довольно сложно, особенно начинающему... Я попробую на досуге что-нть набросать.
Просто относилось только к документации по подготовленным выражениям, а не самой процедуре для данной задачи.
Отредактированно vasya (21.01.2008 15:32:03)
Неактивен
Бальшое спасибо!!!Премного вам благодарен!!!У меня все заработало)Извините,что прешлось мне все так долго обьяснять
Неактивен