ИМХО - бред! Существуют такие запросы которые ни один мозг не осилит! В современной микросхеме с миллиардами транзисторов и 1000 супер-инженеров не раберутся! fanta Я пользуюсь генератором встроенным в MS Access! - очень удобная штука. В инете куча документации по нему.
Вопрос в другом, откуда такие запросы берутся? Может это просто БД через одно место спроектирована?! Сбоит после двух литров пива. После четырёх-пяти обычно вырубается.
Пока не существует ни одной технологии, которая, подобно человеку, могла бы в достаточной степени сгенерировать, оптимизировать и сгруппировать SQL запрос для БД. Всё, что генерируется программами — это просто шаблон, человек не зря на бумажке расписывает задачу, находит узкие места, оптимизирует всё. А шаблонные запросы можно генерировать с помощью TOAD for MySQL (там есть выборка чего да как).
Сотвенно к генератору MSAccess я пришел после того как на нескольких форумах попросил мне помочь сделать выборку одним запросом для магазина на Joomla (это что бы отпали сомнения о "правильности" структуры БД)... и никто не смог мне помочь в написании этого запроса... потом я узнал о конструторе и он выдал мне следующее: PHP: $query = " SELECT $tb_product.product_id, $tb_product.product_name, $tb_manufacturer.mf_name, $tb_category.category_name, $tb_price.product_price, $tb_product.product_sku, $tb_product.product_in_stock, $tb_product.product_unit, $tb_product.product_weight FROM ($tb_product_category_xref RIGHT JOIN ($tb_price RIGHT JOIN (($tb_product_mf_xref RIGHT JOIN $tb_product ON $tb_product_mf_xref.product_id = $tb_product.product_id) LEFT JOIN $tb_manufacturer ON $tb_product_mf_xref.manufacturer_id = $tb_manufacturer.manufacturer_id) ON $tb_price.product_id = $tb_product.product_id) ON $tb_product_category_xref.product_id = $tb_product.product_id) LEFT JOIN $tb_category ON $tb_product_category_xref.category_id = $tb_category.category_id WHERE $tb_manufacturer.manufacturer_id=".$_GET['fmf']; Не смотря на то, что я не плохо разбираюсь в MySQL, и даже составлял давольно сложные запросы - я не понимаю как он работает! Но работает отлично - делает именно то, что требуется.
Apple Все что подчиняется железной логике, компьютер делает лучше чем человек, все зависит от алгоритма реализвации и правил которым следует логика. Все, где присутствует элемент творчества - компьютер бесполезен. Запросы SQL - чистая логика.
Если не знать структуру бд, ни какой генератор не поможет, а если структура еще и кривая, тады воще беда...........
согласен - бред, лучше потратить время на поиск или написание генератора, чем каждый раз писать почти однотипные запросы, типа SELECT-INSERT-UPDATE, сделать чтото типа API для работы с базой, в моем случае на php. 2Apple, 2S.t.A.M. а реализация на php есть этих генераторов?
S.t.A.M. Запрос надо табулировать красиво - тогда легче понять PHP: <?php <?php $query = " SELECT $tb_product.product_id, $tb_product.product_name, $tb_manufacturer.mf_name, $tb_category.category_name, $tb_price.product_price, $tb_product.product_sku, $tb_product.product_in_stock, $tb_product.product_unit, $tb_product.product_weight FROM ($tb_product_category_xref RIGHT JOIN ($tb_price RIGHT JOIN ( ($tb_product_mf_xref RIGHT JOIN $tb_product ON $tb_product_mf_xref.product_id = $tb_product.product_id) LEFT JOIN $tb_manufacturer ON $tb_product_mf_xref.manufacturer_id = $tb_manufacturer.manufacturer_id) ON $tb_price.product_id = $tb_product.product_id) ON $tb_product_category_xref.product_id = $tb_product.product_id) LEFT JOIN $tb_category ON $tb_product_category_xref.category_id = $tb_category.category_id WHERE $tb_manufacturer.manufacturer_id=".$_GET['fmf']; Если дашь конкретный запрос, который получается и структуру таблиц - объясню что происходит
Psih, если напрячся я конечно разберу его... но сколько бы времени у меня ушло на создание такого запроса? а в генераторе несколько кликов мыши ))) Кончно простейшие запросы проще писать самому, но когда в нем учавствуют более 3-х таблиц - ИМХО проще, надежнее и быстрее - генератор! )))
Есть форум с неограниченной вложеностью категорий. (новая версия консольного форума). Нужно узнать, в какой из категорий данной категории есть новые сообщения для данного пользователя. Но сообщения могут быть в одной, или нескольких темах, которая находится на неизвестной глубине (пятая? седьмая? двадцатая?). И если есть хотя бы одно такое сообщение - надо вывести, что в форуме есть новые сообщения. Обратите внимание на запрос. Я не представляю, как объяснить генератору запросов, ЧТО от него нужно в данном случае. Это не банальное подключение папок по идентификатору. PHP: <? public static function hasNewMsgs ($parentDir) { if(!User::isLogged()) { trigger_error('User should be logged', E_USER_ERROR); return; } else if (!($parentDir instanceof Object_Directory)) { trigger_error('$dir should be Object_Directory', E_USER_ERROR); return; } $parentID = $parentDir->id; $userID = User::getInstance()->id; $expires = time() - Object_Subject::HAS_NEW_MSGS_TIMEOUT; $userLRT = User::getInstance()->getLastReadedTime(); $result = Db_Engine::select(" SELECT `CurDirs`.`ID` as `ID`, `Subjects`.`MsgLastID` as `MLastID`, `MsgsReaded`.`MsgID` as `MReadID` FROM `Directories` as `CurDirs` RIGHT JOIN `DirsHierarchy` as `FirstLevel` ON `FirstLevel`.`DirID` = `CurDirs`.`ID` LEFT JOIN `DirsHierarchy` as `All` ON `All`.`ParentID` = `CurDirs`.`ID` OR `All`.`DirID` = `CurDirs`.`ID` LEFT JOIN `Subjects` ON `Subjects`.`DirID` = `All`.`DirID` LEFT JOIN `MsgsReaded` ON `MsgsReaded`.`SbjID` = `Subjects`.`ID` LEFT JOIN `Messages` ON `Messages`.`ID` = `Subjects`.`MsgLastID` WHERE `FirstLevel`.`Level` = 1 AND `FirstLevel`.`ParentID` = $parentID AND ( ( `MsgsReaded`.`UserID` = $userID AND `MsgsReaded`.`Time` > $expires ) OR ( `Messages`.`Time` > $userLRT AND `MsgsReaded`.`SbjID` IS NULL ) ) "); $dirs = array(); for ($i=count($result); $i--;) { if ($result[$i]['MLastID'] > $result[$i]['MReadID']) { $dirs[] = $result[$i]['ID']; } } array_unique($dirs); return $dirs; }
Дааа, это конечно все интересно, но может по теме кто-нибудь ответить, а? Нужно что-то из этой области)) PHP: $sql = GetSql($table, $fields, $where, $limit); //GetSql возвращает sql строку для вставки в запрос
Интересно гереатор поймет, что я хочу написать запрос для оракла 10 версии, а не для мускула? Ихмо генераторы это бред. Никогда не пользовался и не собираюсь.
понял, что тебе нужно. почитай: http://brotkin.ru/2009/02/01/orm/ http://habrahabr.ru/blogs/php/30659/ Хотя вообще, таких движков много. Чтото я не нашел ни одного...
Вот если бы ты хоть раз пользовался и написал что это бред - это было бы весомее ;-) А вообще каждому свое, и спорить тут бессмыслено, главное что бы был мир на планете!
Генераторы очень часто используются для того, чтобы проект работал на любом диалекте. Пишешь чтото типа PHP: <?php $query = new Query; $query->select('*')->from('table')->join('table2')->on('table2.tid', 'table.id')->where('time', '>', 1234567890)->limit(15)->generate() И оно форумирует тебе код на таком диалекте, на котором нужно в данный момент. Но я все-же смутно представляю, как на таком извращении писать сложные запросы.
fanta А почему бы не использовать паттерн ActiveRecord или DataMapper? Откуда такое желание именно генерить запрос?
Неохото привязывать проеты к каким-нибудь ORM (это конечно хорошо когда запросы строятся кросплатформенно, но мне пока не нужно, да и отзывов о них больше отрицательных чем положительных), подыскиваю php класс который будет генерить запрос в зависимости от переданных параметров. оптимизация, зачем каждый раз писать одно и тоже.