За последние 24 часа нас посетили 17845 программистов и 1614 роботов. Сейчас ищет 1481 программист ...

Работа с множеством СУБД через единый интерфейс.

Тема в разделе "Решения, алгоритмы", создана пользователем Hight, 6 апр 2007.

  1. Anonymous

    Anonymous Guest

    ONK, видимо, можно. =)
    Оракловский SQL -optimizer — адская штука.
    Опираясь на индексы.
     
  2. ONK

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

    С нами с:
    4 фев 2006
    Сообщения:
    281
    Симпатии:
    0
    Адрес:
    СПб
    Горбунов Олег, с индексами всё элементарно, с ними и mysql умеет оптимизировать сортировку и группировку, вопрос в том, что делать, если нет индексов.

    ПС. такой способ исполнения запросов поддерживается и mysql (mysql_unbuffered_query).
     
  3. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Горбунов Олег
    Хм... как быть незадачливому пользователю Оракла в случае, если надо выбрать записи, скажем, для 15-й страницы (по 100 записей на странице), из таблицы в 10,000 записей?

    MySQL:
    Код (Text):
    1. SELECT * FROM table LIMIT 1400,100
     
  4. Anonymous

    Anonymous Guest

    Dagdamor, как бы сказать, Oracle вообще-то не предназначен для таких задач =)
    Но, как я уже писал,
    PHP:
    1. <?php
    2.       $query = 'SELECT * FROM table';
    3.       $query = 'select * from (select rownum rn, k.* from('.$query.') k ) where rn >= ('.$first_record+1.') and rn <= ('.$first_record + $Sys_every_page.')';
    4.       $res = $db->Query($query);
    5. ?>
    хехе =)
     
  5. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Горбунов Олег
    Другими словами, сначала выбираем все 10,000 записей, потом отсекаем ненужное.
    Неудивительно, что в нем аццкий оптимизатор. Без него походу никак ;)
     
  6. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    (продолжу флейм).
    как насчет $db->select($fields,$tables, $join,$where,$limit);
     
  7. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    armadillo
    По-моему, обычный SQL запрос будет выглядеть более читабельно :)
     
  8. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    то есть проще брать
    $db->query($sql)
    и парсить его, меняя под конкретную базу?
     
  9. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    armadillo
    Я про "$db->select($fields,$tables, $join,$where,$limit)"
    По-моему, функция с таким набором аргументов будет генерировать запрос, совместимый с ANSI SQL.
    А если запрос все равно получается стандартный, зачем делить его на части?
    Ну или приведи примеры использования такого метода, чтобы было понятнее.
     
  10. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    if ($limit && $oracle) {
    ...


    if ($join && $mysql4)
    $join=substr(trim($join),1,-1);

    Скажем, getFilter() все равно может возвращать условие в виде array($tables,$join,$where)
     
  11. Psih

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

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Такие select/insert/update функции позволяют делать простейшие запросы легко и просто, передаёшь пару массивов, название таблицы и запрос генерируеться с квотированием данных и прочими прелестями. Иногда удобно :)

    З.Ы. А вот можно пример такой функции select, которая бы ещё и JOIN генерировала?....
     
  12. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    зависит от того, что ты хочешь.
    1) join формируется строкой, просто он может быть разный в зависимости от условия.
    2) формируется массивом, малопонятно как ты хочешь задавать условие.

    например.
    $join=array('t1'=>array('table1','t1.id=t0.t1_id and t1.date>now()- interval 30 day'),
    array('t2'=>array('table2','t2.id=t1.t2_id'));
     
  13. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    armadillo, не слишком читабельно... проще уж написать if ($oracle) и сделать два варианта запроса..
     
  14. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    не слишком читабельно что? $db-select($table ?
    я не говорю, что это хорошо и тем более все надо делать так. Но обсудить достоинства и недостатки стоит.
    Смысл в том чтобы
    PHP:
    1. if ($filter['addons']>0) {
    2. $join[]=' cars_bamper cb On cb.car_type_id=cars.type';
    3. $where.=" AND cb.name like '%кенгу%';
    4. }
    5. if ($filter['price']) {...
    и if($oracle) надо писать внутри класса, а снаружи не знать, какая там сейчас бд.
     
  15. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    не читабельны многовложенные массивы. всё равно полностью не знать о субд не получится и в этом свете я выбираю наглядный SQL, а не птичий язык с многочисленными array.
     
  16. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    Угу, многовложенность хуже.

    имеется код:
    PHP:
    1. $filter=getFilter();
    2.  
    3. $sql="select distinct(t1.id),......
    4. from ...
    5. ".$tables.
    6. $join."
    7. where t1.visible=1 and
    8. ".$where."
    9. order by...
    что будет в filter - заранее неизвестно.
     
  17. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    armadillo
    [offtopic] Зачем ты используешь оператор "." со строками в двойных кавычках? [/offtopic]
     
  18. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    в смысле почему не " $tables $join $where" ?

    мне так нагляднее, где вставка в текст.
    одинаковая запись разных видов, " where t1.name='".$row['refname']."' ";
     
  19. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    я предпочитаю так:
    Код (Text):
    1. $path= $db->get2d('
    2.     select *
    3.     from
    4.         mo_catalog as c,
    5.         mo_users as u
    6.     where
    7.         c.user_id = u.user_id
    8.     and
    9.         c.cat_no <= ',$cat['cat_no'],'
    10.     and
    11.         c.cat_sub >= ',$cat['cat_sub'],'
    12.     order by c.cat_no
    13. ');
     
  20. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    массив? implode('',"'".mysql_real_escape_string($sql)."'") ?
     
  21. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    а? шо? ты, эта, разворачивай мысль, чтоли...
     
  22. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    ты передаешь массив func_get_args() , и там уже обертываешь в кавычки и т.п.
    интересная мысля, хотя придется поизвращаться, если надо добавлять какие-то еще параметры - имя базы и т.п.
    но это для простых селектов, я тут говорю про $join=" t1 on t1.name like '%".$name."%' ";
     
  23. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    а, ну да, чётные экранируются, нечётные - нет. извращяться там нигде не надо. и в примере у меня происходит неявное связывание таблиц, которое ничем не хуже твоего явного, но без указания типа связывания.
     
  24. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    не понял.

    Какие случаи больше распространены?
     
  25. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    может расскажешь о своей задаче, где заранее неизвестно что с чем джойнится? :)