За последние 24 часа нас посетили 95373 программиста и 2689 роботов. Сейчас ищут 1572 программиста ...

Генератор SQL

Тема в разделе "PHP и базы данных", создана пользователем fanta, 14 июн 2009.

  1. fanta

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

    С нами с:
    19 апр 2007
    Сообщения:
    53
    Симпатии:
    0
    Встречал ли кто-нибудь хороший генератор sql запроса?
     
  2. vasa_c

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

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Лучший генератор sql-запроса — моск.
     
  3. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    ИМХО - бред! Существуют такие запросы которые ни один мозг не осилит! В современной микросхеме с миллиардами транзисторов и 1000 супер-инженеров не раберутся!

    fanta
    Я пользуюсь генератором встроенным в MS Access! - очень удобная штука.
    В инете куча документации по нему.
     
  4. vasa_c

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

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Вы собрались делать выборку по транзисторам?
     
  5. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Вопрос в другом, откуда такие запросы берутся? Может это просто БД через одно место спроектирована?!
    Сбоит после двух литров пива. После четырёх-пяти обычно вырубается.
     
  6. kostyl

    kostyl Guest

    А на миллиард транзисторов и капли пива хватит убиться в кизло...
     
  7. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Пока не существует ни одной технологии, которая, подобно человеку, могла бы в достаточной степени сгенерировать, оптимизировать и сгруппировать SQL запрос для БД.
    Всё, что генерируется программами — это просто шаблон, человек не зря на бумажке расписывает задачу, находит узкие места, оптимизирует всё.

    А шаблонные запросы можно генерировать с помощью TOAD for MySQL (там есть выборка чего да как).
     
  8. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    Сотвенно к генератору MSAccess я пришел после того как на нескольких форумах попросил мне помочь сделать выборку одним запросом для магазина на Joomla (это что бы отпали сомнения о "правильности" структуры БД)... и никто не смог мне помочь в написании этого запроса... потом я узнал о конструторе и он выдал мне следующее:

    PHP:
    1. $query = "
    2. SELECT
    3.     $tb_product.product_id,
    4.     $tb_product.product_name,
    5.     $tb_manufacturer.mf_name,
    6.     $tb_category.category_name,
    7.     $tb_price.product_price,
    8.     $tb_product.product_sku,
    9.     $tb_product.product_in_stock,
    10.     $tb_product.product_unit,
    11.     $tb_product.product_weight
    12. FROM
    13.     ($tb_product_category_xref
    14. RIGHT JOIN ($tb_price
    15. RIGHT JOIN (($tb_product_mf_xref
    16. RIGHT JOIN $tb_product
    17. ON $tb_product_mf_xref.product_id = $tb_product.product_id)
    18. LEFT JOIN $tb_manufacturer
    19. ON $tb_product_mf_xref.manufacturer_id = $tb_manufacturer.manufacturer_id)
    20. ON $tb_price.product_id = $tb_product.product_id)
    21. ON $tb_product_category_xref.product_id = $tb_product.product_id)
    22. LEFT JOIN $tb_category
    23. ON $tb_product_category_xref.category_id = $tb_category.category_id
    24. WHERE $tb_manufacturer.manufacturer_id=".$_GET['fmf'];
    Не смотря на то, что я не плохо разбираюсь в MySQL, и даже составлял давольно сложные запросы - я не понимаю как он работает! Но работает отлично - делает именно то, что требуется.
     
  9. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    Apple
    Все что подчиняется железной логике, компьютер делает лучше чем человек, все зависит от алгоритма реализвации и правил которым следует логика.
    Все, где присутствует элемент творчества - компьютер бесполезен.
    Запросы SQL - чистая логика.
     
  10. akrinel

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

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    Угу, по любому.
     
  11. Goryn

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

    С нами с:
    4 апр 2006
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    Ярославль
    Если не знать структуру бд, ни какой генератор не поможет, а если структура еще и кривая, тады воще беда...........
     
  12. fanta

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

    С нами с:
    19 апр 2007
    Сообщения:
    53
    Симпатии:
    0
    согласен - бред, лучше потратить время на поиск или написание генератора, чем каждый раз писать почти однотипные запросы, типа SELECT-INSERT-UPDATE, сделать чтото типа API для работы с базой, в моем случае на php.

    2Apple, 2S.t.A.M. а реализация на php есть этих генераторов?
     
  13. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    +1
     
  14. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    а я где-то видел генератор php кода ;)
     
  15. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    S.t.A.M.
    Запрос надо табулировать красиво - тогда легче понять :)
    PHP:
    1. <?php
    2. <?php
    3.  
    4. $query = "
    5.  SELECT
    6.      $tb_product.product_id,
    7.      $tb_product.product_name,
    8.      $tb_manufacturer.mf_name,
    9.      $tb_category.category_name,
    10.      $tb_price.product_price,
    11.      $tb_product.product_sku,
    12.      $tb_product.product_in_stock,
    13.      $tb_product.product_unit,
    14.      $tb_product.product_weight
    15.  FROM
    16.      ($tb_product_category_xref
    17.           RIGHT JOIN ($tb_price
    18.             RIGHT JOIN (
    19.                     ($tb_product_mf_xref
    20.                     RIGHT JOIN $tb_product ON $tb_product_mf_xref.product_id = $tb_product.product_id)
    21.                 LEFT JOIN $tb_manufacturer ON $tb_product_mf_xref.manufacturer_id = $tb_manufacturer.manufacturer_id)
    22.             ON $tb_price.product_id = $tb_product.product_id)
    23.         ON $tb_product_category_xref.product_id = $tb_product.product_id)
    24.  LEFT JOIN $tb_category ON $tb_product_category_xref.category_id = $tb_category.category_id
    25.  WHERE $tb_manufacturer.manufacturer_id=".$_GET['fmf'];
    26.  
    Если дашь конкретный запрос, который получается и структуру таблиц - объясню что происходит :)
     
  16. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    Psih, если напрячся я конечно разберу его... но сколько бы времени у меня ушло на создание такого запроса? а в генераторе несколько кликов мыши )))
    Кончно простейшие запросы проще писать самому, но когда в нем учавствуют более 3-х таблиц - ИМХО проще, надежнее и быстрее - генератор! )))
     
  17. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Есть форум с неограниченной вложеностью категорий. (новая версия консольного форума). Нужно узнать, в какой из категорий данной категории есть новые сообщения для данного пользователя. Но сообщения могут быть в одной, или нескольких темах, которая находится на неизвестной глубине (пятая? седьмая? двадцатая?). И если есть хотя бы одно такое сообщение - надо вывести, что в форуме есть новые сообщения. Обратите внимание на запрос. Я не представляю, как объяснить генератору запросов, ЧТО от него нужно в данном случае. Это не банальное подключение папок по идентификатору.
    PHP:
    1.     <?
    2. public static function hasNewMsgs ($parentDir) {
    3.         if(!User::isLogged()) {
    4.             trigger_error('User should be logged', E_USER_ERROR);
    5.             return;
    6.         } else if (!($parentDir instanceof Object_Directory)) {
    7.             trigger_error('$dir should be Object_Directory', E_USER_ERROR);
    8.             return;
    9.         }
    10.         $parentID = $parentDir->id;
    11.         $userID = User::getInstance()->id;
    12.         $expires = time() - Object_Subject::HAS_NEW_MSGS_TIMEOUT;
    13.         $userLRT = User::getInstance()->getLastReadedTime();
    14.  
    15.         $result = Db_Engine::select("
    16. SELECT `CurDirs`.`ID` as `ID`, `Subjects`.`MsgLastID` as `MLastID`, `MsgsReaded`.`MsgID` as `MReadID`
    17. FROM `Directories` as `CurDirs`
    18. RIGHT JOIN `DirsHierarchy` as `FirstLevel`
    19.     ON `FirstLevel`.`DirID` = `CurDirs`.`ID`
    20. LEFT JOIN `DirsHierarchy` as `All`
    21.     ON `All`.`ParentID` = `CurDirs`.`ID` OR `All`.`DirID` = `CurDirs`.`ID`
    22. LEFT JOIN `Subjects`
    23.     ON `Subjects`.`DirID` = `All`.`DirID`
    24. LEFT JOIN `MsgsReaded`
    25.     ON `MsgsReaded`.`SbjID` = `Subjects`.`ID`
    26. LEFT JOIN `Messages`
    27.     ON `Messages`.`ID` = `Subjects`.`MsgLastID`
    28. WHERE
    29.         `FirstLevel`.`Level`    = 1
    30.     AND `FirstLevel`.`ParentID` = $parentID
    31.     AND (
    32.         ( `MsgsReaded`.`UserID` = $userID AND `MsgsReaded`.`Time` > $expires )
    33.             OR
    34.         ( `Messages`.`Time` > $userLRT AND  `MsgsReaded`.`SbjID` IS NULL )
    35.     )
    36.         ");
    37.  
    38.         $dirs = array();
    39.         for ($i=count($result); $i--;) {
    40.             if ($result[$i]['MLastID'] > $result[$i]['MReadID']) {
    41.                 $dirs[] = $result[$i]['ID'];
    42.             }
    43.         }
    44.         array_unique($dirs);
    45.         return $dirs;
    46.     }
     
  18. web_programmist

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

    С нами с:
    20 июн 2009
    Сообщения:
    18
    Симпатии:
    0
    Дааа, это конечно все интересно, но может по теме кто-нибудь ответить, а?

    Нужно что-то из этой области))
    PHP:
    1.  
    2. $sql = GetSql($table, $fields, $where, $limit);
    3. //GetSql возвращает sql строку для вставки в запрос
    4.  
     
  19. kostyl

    kostyl Guest

    Интересно гереатор поймет, что я хочу написать запрос для оракла 10 версии, а не для мускула?
    Ихмо генераторы это бред. Никогда не пользовался и не собираюсь.
     
  20. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
  21. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    Вот если бы ты хоть раз пользовался и написал что это бред - это было бы весомее ;-)
    А вообще каждому свое, и спорить тут бессмыслено, главное что бы был мир на планете!
     
  22. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Генераторы очень часто используются для того, чтобы проект работал на любом диалекте. Пишешь чтото типа
    PHP:
    1. <?php
    2. $query = new Query;
    3. $query->select('*')->from('table')->join('table2')->on('table2.tid', 'table.id')->where('time', '>', 1234567890)->limit(15)->generate()
    И оно форумирует тебе код на таком диалекте, на котором нужно в данный момент. Но я все-же смутно представляю, как на таком извращении писать сложные запросы.
     
  23. iliavlad

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

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    В Zend Framework похоже запросы создаются.
     
  24. Black Raven

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

    С нами с:
    8 июн 2009
    Сообщения:
    25
    Симпатии:
    0
    fanta
    А почему бы не использовать паттерн ActiveRecord или DataMapper?
    Откуда такое желание именно генерить запрос?
     
  25. web_programmist

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

    С нами с:
    20 июн 2009
    Сообщения:
    18
    Симпатии:
    0
    Неохото привязывать проеты к каким-нибудь ORM (это конечно хорошо когда запросы строятся кросплатформенно, но мне пока не нужно, да и отзывов о них больше отрицательных чем положительных), подыскиваю php класс который будет генерить запрос в зависимости от переданных параметров.

    оптимизация, зачем каждый раз писать одно и тоже.