Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.10.26;
Скачать: CL | DM;

Вниз

Вложенный запрос   Найти похожие ветки 

 
Alex86   (2008-09-19 12:21) [0]

Помогите объединить в один запрос тк не сильно знаком с sql:

SQL.Text := "SELECT MIN(ITEM_ID) FROM CONTENT WHERE (FLAGS <> 1) AND (GROUP_ID <> 0)";
Open;
 LastItem := Fields[0].AsInteger;
SQL.Text := Format("SELECT MAX(ITEM_ID) CONTENT ITEM WHERE (FLAGS <> 1) AND (GROUP_ID <> 0) AND (ITEM_ID < %d) AND (ITEM_ID >= %d)",
               [CurItemByKey, LastItem]);
   Open;


 
Palladin ©   (2008-09-19 12:25) [1]

и какая великая цель сего действия будет?


 
Alex86   (2008-09-19 12:27) [2]

Next по определенным записям в таблице


 
Palladin ©   (2008-09-19 12:29) [3]

у тебя агрегирующая функция в запросе и нет группировки
возвращатся будет всегда одна запись

ты словами опиши что ты на выходе получить хочешь, с примером


 
Alex86   (2008-09-19 12:39) [4]

Необходимо организовать перемещение по определленным записям в таблице (например записям с полем flags = 1 и полем group_id = 0). Метод должен возвращаться id записи на которую переместились. Если запись была последняя и мы вызвали методо должен возвратиться 0.

Вообщемто вот весь код метода:

function Next: Integer;
var
 LastItem: Integer;
begin
 Result := -1;
     with cmp_Query_ do
       try
         cmp_DataBase.StartTransaction;
         try
           SQL.Text := "SELECT MAX(ITEM_ID) FROM ITEM WHERE (FLAGS <> 1) AND (GROUP_ID <> 0)";
           Open;
           LastItem := Fields[0].AsInteger;
           SQL.Text := Format("SELECT MIN(ITEM_ID) FROM ITEM WHERE (FLAGS <> 1) AND (GROUP_ID <> 0) AND (ITEM_ID > %d) AND (ITEM_ID <= %d)",
             [CurItemByKey, LastItem]);
           Open;
           if Fields[0].AsInteger > CurItemByKey then
             Result := Fields[0].AsInteger
           else
             Result := 0;
           if Result > 0 then
             CurItemByKey := Result;
           except
             cmp_DataBase.Rollback;
           end;
           cmp_DataBase.Commit;
       except
         on E: Exception do
           raise;
       end
end;


 
Sergey13 ©   (2008-09-19 13:01) [5]

> [4] Alex86   (19.09.08 12:39)
> Необходимо организовать перемещение по определленным записям
> в таблице

Перемещаться можно по набору данных (он же датасет). По таблице перемещаться невозможно в принципе. У датасета есть свои методы для перемещения - Next, Prior, First, Last. По достижении конца датасета истинными становятся свойства датасета EOF и BOF.

Велосипед изобретаем что ли?


 
Johnmen ©   (2008-09-19 13:01) [6]

Перемещаться можно только по определленным записям в наборе данных. Который получен запросом недавно. А на текущий момент значения min/max в таблице уже м.б. другими.
А во-вторых, кури Eof и Bof.


 
ЮЮ ©   (2008-09-19 13:05) [7]

> Вообщемто вот весь код метода:


а код метода CurItemByKey?

И вообще зачем это?


> Необходимо организовать перемещение по определленным записям
> в таблице (например записям с полем flags = 1 и полем group_id
> = 0).


Выбрать нужные записи, а у любого DataSet-a есть свой Nехт.


 
Alex86   (2008-09-19 13:25) [8]

А если записей в таблице 500 000 и каждые 10 секунд могут изменяться другими пользователями, не делать же каждый раз выборку нужных записей (так как под условие выборки может подпадать и 200 000 и 300 000 тыс записей таблице).


 
Johnmen ©   (2008-09-19 13:28) [9]


> не делать же каждый раз выборку нужных записей (так как
> под условие выборки может подпадать и 200 000 и 300 000
> тыс записей таблице).

И зачем вдруг может понадабиться 200 000 записей сразу?


 
Sergey13 ©   (2008-09-19 13:34) [10]

> [9] Johnmen ©   (19.09.08 13:28)
> И зачем вдруг может понадабиться 200 000 записей сразу?

Проверить, а вдруг там уже 200 001. Вот и надо свом методом до нее досчитать.


 
Alex86   (2008-09-19 13:35) [11]

Вообщем есть таблица бд в которой содержаться товары у которых group_id = 1, и разделы у которых group_id = 0 (бд делал не я так что приходится работать с такой какая есть). Всего записей порядка 500 000. Так вот нужно сделать функцию которая позволила бы перемещаться только по товарам и в качестве результата возвращала id текущего товара.


 
Johnmen ©   (2008-09-19 13:38) [12]


> функцию которая позволила бы перемещаться только по товарам

Какова конечная цель "перемещения"?


 
Alex86   (2008-09-19 13:43) [13]

перемещение будет определять товар с которым впоследствии будем работать (+ для работы с товарами реализован ряд методов).


 
Johnmen ©   (2008-09-19 13:53) [14]

Как это перемещение может что-то определять???


 
Sergey13 ©   (2008-09-19 14:09) [15]

> [11] Alex86   (19.09.08 13:35)

Т.е. полмиллиона записей классифицирутся только флагом группа/раздел?
Разделов, я полагаю, немного, штук 100-200. и 499800 товаров. И по ним по всем перемещаться?
Шикарно! 8-)


 
Johnmen ©   (2008-09-19 14:23) [16]


> Sergey13 ©   (19.09.08 14:09) [15]
> Шикарно! 8-)

Щикарно (с) ЮП


 
ANB   (2008-09-19 15:24) [17]

Извращение, конечно, так работать со справочником. Нормально - отобрать по условию нужный, ограниченный набор данных, и работать с набором данных на локале.

Хотя иногда вылезает необходимость ходить туда - сюда по большой таблице.

Но это надо писать свой навигатор.

В таблице обязательно должно быть поле ID. Сортировка при навигации будет тогда только по нему. Или надо будет изобретать хитрый ключ для сортировки.
А дальше все просто - храним на локале ID начала и конца окна и вовремя выполняем запросы для его перемещения.



Страницы: 1 вся ветка

Текущий архив: 2008.10.26;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
2-1221561139
Zalumhan
2008-09-16 14:32
2008.10.26
Повторяющиеся элементы в массиве


15-1220500439
@!!ex
2008-09-04 07:53
2008.10.26
Как получить список функций из dll?


15-1218174240
TUser
2008-08-08 09:44
2008.10.26
Объявлена дата запуска LHC


6-1194522830
Андрей_Св
2007-11-08 14:53
2008.10.26
Сервер


15-1220517795
{RASkov}
2008-09-04 12:43
2008.10.26
DMClient заболел?