SELECT * FROM table ORDER BY table.column LIMIT table.ID = myID, 20

flash-vkv

Новичок
SELECT * FROM table ORDER BY table.column LIMIT table.ID = myID, 20

мож кто встречался с такой проблемой
есть таблица k - полей и поле ID(PRIMARY)
требуется выдать LIMIT n строк наченая с table.ID = myID при этом результат должен быть с сортировкой по какомуто полю. Образно "запрос" такой
SELECT * FROM table ORDER BY table.column LIMIT table.ID = myID, 20

буду счаслев если есть простое решение подобной конструкции
 

Фанат

oncle terrible
Команда форума
подробно. что за поля, зачем запрос, какая задача
 

flash-vkv

Новичок
поля как поля таблицы не имеет значение что они содержут.
практическое применение надо увидеть своими глазами но в крадце :
гдето (только раз) встречал выражение пейджинг таблицы(мне оно не совсем нравится), те зная только ID строки можно получить эту строку и все строки которые идут за ней при сортировке нужной калонки. меняем поле сортировки верхняя(первая) строка остается неизменной(ID не изменен) а список уже осортирован по другому полю. это часто можно встретить где используется компонент Grid в систе.. програмировании.
Вобшем задача и есть создание TGrid - а в вебе. но применение может найти и к примеру в инкрементном поиске.
 

zerkms

TDD infected
Команда форума
те зная только ID строки
ты явно не понял чего то
для того чтобы сделать пейджинг тебе нужно:
1. знать номер текущей страницы ($n)
2. знать число записей на страницу ($c)

LIMIT $n * $c, $c

а потом уже сортировать как твоей душе будет угодно
 

flash-vkv

Новичок
да наверно я не понял смысл словосочетания "пейджинг " и не к месту привел, но задача другая . Нужно создать реальный TGrid с прокруткой хотяб от стрелок клаввиатуры и без ползунков. Сама проблема рождает эту задачу.с ORDER BY table.column LIMIT table.ID = myID, 20
Возможно ли подобную конструкцию реализовать стандартными средствами на ораколе? с ним я некогда не работал потому даже не знаю его возможностей.
 

Фанат

oncle terrible
Команда форума
сначала находишь значение поля, по которому сортируешь, соответствующее выбранному id
после этого
получить эту строку и все строки которые идут за ней при
не составит труда
 

flash-vkv

Новичок
Фанат Молодец а если таких значений по этому полю не одно 2,3,..., 100 тоже просто. Я так и с делал на даннй момент но всеже, а про оракл есть там возможность решения , я неговарю только о SQL способах мож что есть спецефичное?
 

flash-vkv

Новичок
чтобы сперва говарили то что наиболие правельно а потом только все остально в твоем случии оно совпало с моим
а у тебя есть другие решения? хотя как я голову не ломал но по другому взглянуть на решение не получилось, потому на форум и вынес вопрос так сказать услышать свежее
приведу код до чего пока дошол
PHP:
$queryStr = 'SELECT '.$rowSel.'
                       FROM '.$tablename.'
                     WHERE  a.row_id = '.$this->id.'
                          and '.$this->otborKat.'
                          and '.$this->udlovKategor.' '.$filtSql.'
                            ';
$result = mysql_query($queryStr)
                          or die($this->errorQuery("GetlistID_UpDn #1", $queryStr) );
if (mysql_num_rows($result) == 1 ) {
                        $Row=mysql_fetch_row ($result);
                        $valueSel = addslashes($Row[0] );
                        } else {return false; }


mysql_query("SET @cnt = 0");
$queryStrA = 'SELECT @cnt:=@cnt+1 AS rowNum, a.row_id idFin
                         FROM '.$tablename.'
                       WHERE '.$rowSel.' = "'.$valueSel.'"
                            and '.$this->otborKat.'
                            and '.$this->udlovKategor.' '.$filtSql.'
                   ORDER BY '.$rowOrd.' ';

 $queryStr =  'SELECT rowNum
                          FROM ('.$queryStrA.') AS a
                       WHERE idFin ='.$this->id.'
                             ';
 $result = mysql_query($queryStr )
                            or die($this->errorQuery("GetlistID_UpDn #2", $queryStr) );

 if ($row = mysql_fetch_assoc ($result) ){
                      $StartI = $row['rowNum'] - 1;
                       } else {return false;}
$queryStr = 'SELECT '.$result_row.' FROM '.$tablename.'
                     WHERE '.$rowSel.' '.$uslov.' "'.$valueSel.'"'.'
                          and '.$this->otborKat.'
                          and '.$this->udlovKategor.' '.$filtSql.'
                 ORDER BY '.$rowOrd.'
                        LIMIT '.$StartI.','.$this->LRowMax.'';

 $result = mysql_query($queryStr)
                        or die($this->errorQuery("GetlistID_UpDn #3", $queryStr) );
мож сдесь чем поправети метким взглядом
 

Фанат

oncle terrible
Команда форума
То есть, решение у тебя есть? А вопрос ты задал от скуки.
Так и запишем.
 

flash-vkv

Новичок
запишет меня Фанат кудато или нет проблему не решит, этот подход прос и давольно эффективено но когда число записей переваливает за 5-10 тыс. то сильно напрягает кремнивые мозги. Потому вопос открыт. кому надо кину на маил клиенскую часть (чтобы полностью понять для чего это), сервера заменяет xml фаил потому смену колонок там не увидете но можно понять по какому принцепу идет скрол.
 

Фанат

oncle terrible
Команда форума
с какого перепугу этот запрос начал вдруг напрягать какие-то мозги, кроме твоих?
 

flash-vkv

Новичок
0.03с (если не забыл) столько времени выполняется последний SQL запрос. всего в таблице 68000 записей, EXPLAIN показывает что в запросе просматриваются 2-3тыс. записи , но это только для небольшой группы ограниченой условием WHERE. в итоге один клиен с постоянным запросом ресурса грузит проц на 60-70-- все 100%, и получает по 4-6 (примерно) результатов в сек. Многовато нагрузки от одного клиента.
 

Фанат

oncle terrible
Команда форума
хахахахахахаха!
а клиент, по ходу, скроллит таблицу, как я понимаю?
 

flash-vkv

Новичок
Фанат почти угадал, при скролинге те прокрутке вверх в низ запросы идут редко и не сильно прягут проц, смысл скролинга в том что в таблице при движении вверх нижня строка удаляется в вначало вставляется новая, вниз наоборот сверху удаляем а снизу добавляем, в буфере всегда хранится гдето от 50 до 150 строк потому они не скоро кончаются чтобы загружать новую порцию.
но я виду реч при постояном запросе от клиента к примеру когда нужно сменит сортировку колонки, или этих клиентов довала.

мож кто поможет с оптимезацией таблице и запроса
таблица такая
Код:
CREATE TABLE t_conect (
  row_id int(11) NOT NULL auto_increment,
  free int(1) NOT NULL default '0',
  key_org int(1) NOT NULL default '0',
  id_inf int(11) NOT NULL default '0',
  in09 int(1) NOT NULL default '0',
  small_name varchar(35) NOT NULL default '',
  id_strType int(11) NOT NULL default '0',
  id_street int(11) NOT NULL default '0',
  small_addr varchar(50) NOT NULL default '',
  id_town int(11) NOT NULL default '0',
  phone varchar(10) NOT NULL default '',
  krossA varchar(10) NOT NULL default '',
  krossB varchar(10) NOT NULL default '',
  rihgt_groups varchar(15) NOT NULL default '',
  PRIMARY KEY  (row_id),
  KEY small_addr (small_addr,row_id),
  KEY phone (phone,row_id),
  KEY krossA (krossA,row_id),
  KEY krossB (krossB,row_id),
  KEY key_org (key_org),
  KEY id_town (id_town),
  KEY rihgt_groups (rihgt_groups),
  KEY small_name (small_name,row_id)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
запрос такой

Код:
SELECT a.row_id idrow,
a.key_org org,
f.name infOrg,
a.small_name name,
a.small_addr sreet,
d.small_name small_town,
d.town_name town_name,
d.sid sidTown,
a.phone phone,
a.in09 in09,
a.krossA krossA,
a.krossB krossB
FROM t_conect AS a LEFT JOIN t_town AS d ON a.id_town = d.row_id
                                LEFT JOIN t_infp_org AS f ON a.id_inf = f.row_id
                                     
WHERE a.small_name >= "\"ЛАПТЕВО-ЛОГОВСКАЯ СРЕДНЯЯ ОБЩЕОБРА"
     and a.id_town IN (8, 18, 32, 59, 62, 66, 70, 71, 86, 87, 90, 94, 103, 104, 105, 117, 121, 126, 127)
     and a.rihgt_groups = "alt79"
ORDER BY a.small_name, a.row_id
LIMIT 0,18
 
Сверху