Горбунов Олег, с индексами всё элементарно, с ними и mysql умеет оптимизировать сортировку и группировку, вопрос в том, что делать, если нет индексов. ПС. такой способ исполнения запросов поддерживается и mysql (mysql_unbuffered_query).
Горбунов Олег Хм... как быть незадачливому пользователю Оракла в случае, если надо выбрать записи, скажем, для 15-й страницы (по 100 записей на странице), из таблицы в 10,000 записей? MySQL: Код (Text): SELECT * FROM table LIMIT 1400,100
Dagdamor, как бы сказать, Oracle вообще-то не предназначен для таких задач =) Но, как я уже писал, PHP: <?php $query = 'SELECT * FROM table'; $query = 'select * from (select rownum rn, k.* from('.$query.') k ) where rn >= ('.$first_record+1.') and rn <= ('.$first_record + $Sys_every_page.')'; $res = $db->Query($query); ?> хехе =)
Горбунов Олег Другими словами, сначала выбираем все 10,000 записей, потом отсекаем ненужное. Неудивительно, что в нем аццкий оптимизатор. Без него походу никак
armadillo Я про "$db->select($fields,$tables, $join,$where,$limit)" По-моему, функция с таким набором аргументов будет генерировать запрос, совместимый с ANSI SQL. А если запрос все равно получается стандартный, зачем делить его на части? Ну или приведи примеры использования такого метода, чтобы было понятнее.
if ($limit && $oracle) { ... if ($join && $mysql4) $join=substr(trim($join),1,-1); Скажем, getFilter() все равно может возвращать условие в виде array($tables,$join,$where)
Такие select/insert/update функции позволяют делать простейшие запросы легко и просто, передаёшь пару массивов, название таблицы и запрос генерируеться с квотированием данных и прочими прелестями. Иногда удобно З.Ы. А вот можно пример такой функции select, которая бы ещё и JOIN генерировала?....
зависит от того, что ты хочешь. 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'));
не слишком читабельно что? $db-select($table ? я не говорю, что это хорошо и тем более все надо делать так. Но обсудить достоинства и недостатки стоит. Смысл в том чтобы PHP: if ($filter['addons']>0) { $join[]=' cars_bamper cb On cb.car_type_id=cars.type'; $where.=" AND cb.name like '%кенгу%'; } if ($filter['price']) {... и if($oracle) надо писать внутри класса, а снаружи не знать, какая там сейчас бд.
не читабельны многовложенные массивы. всё равно полностью не знать о субд не получится и в этом свете я выбираю наглядный SQL, а не птичий язык с многочисленными array.
Угу, многовложенность хуже. имеется код: PHP: $filter=getFilter(); $sql="select distinct(t1.id),...... from ... ".$tables. $join." where t1.visible=1 and ".$where." order by... что будет в filter - заранее неизвестно.
в смысле почему не " $tables $join $where" ? мне так нагляднее, где вставка в текст. одинаковая запись разных видов, " where t1.name='".$row['refname']."' ";
я предпочитаю так: Код (Text): $path= $db->get2d(' select * from mo_catalog as c, mo_users as u where c.user_id = u.user_id and c.cat_no <= ',$cat['cat_no'],' and c.cat_sub >= ',$cat['cat_sub'],' order by c.cat_no ');
ты передаешь массив func_get_args() , и там уже обертываешь в кавычки и т.п. интересная мысля, хотя придется поизвращаться, если надо добавлять какие-то еще параметры - имя базы и т.п. но это для простых селектов, я тут говорю про $join=" t1 on t1.name like '%".$name."%' ";
а, ну да, чётные экранируются, нечётные - нет. извращяться там нигде не надо. и в примере у меня происходит неявное связывание таблиц, которое ничем не хуже твоего явного, но без указания типа связывания.